2016-04-21 3 views
0

У меня есть базовая программа квадратичной формулы, но я изменил начало, чтобы закончить программу, если введено другое значение, отличное от двойного. Однако, поскольку я сделал это, я, похоже, не могу использовать значение, введенное где-либо еще в программе. Вот первые несколько строк:В Java, как я могу использовать переменную, инициализированную внутри блока try/catch в другом месте программы?

import java.util.Scanner; 

public class QuadraticFormula 
{ 
    public static void main(String[] args) 
    { 
    double a, b, c; 
    Scanner reads = new Scanner(System.in); 

    System.out.println("General equation: \"ax^2 + bx + c\""); 
    System.out.print("Enter value of \"a\": "); 

    try { 
     String doubleString = reads.nextLine(); 
     a = Double.parseDouble(doubleString); 
    } 
    catch (Exception e) { 
     System.out.println("Invalid Data Type. Please enter a number"); 
    } 

Остальная часть программы запрашивает значения Ь и с, а затем выполняет квадратное уравнение, перенастройка корни уравнения независимо было введено. Однако, поскольку значение a определено внутри раздела try, компилятор сообщает мне, что a не был инициализирован. Как это исправить?

EDIT: Я хочу использовать данные, введенные пользователем в программе (хранимые как doubleString), - но число. Моя непосредственная проблема - ошибка компилятора, но есть ли способ использовать введенную информацию, даже если она находится внутри блока try? Потому что, когда я пытался сопоставить double a double doubleString за пределами блока, он сказал, что doubleString не существует.

+0

Дайте 'a' начальное значение по умолчанию; подумайте, есть ли исключение. Без значения по умолчанию 'a' вообще не имеет значения. –

+0

@ ElliottFrisch Я не думаю, что это то, о чем спрашивает OP.Это вход сканера, который нельзя использовать нигде. @Caroline 'String doubleString = reads.nextLine();' не будет генерировать исключение и, следовательно, не обязательно находиться внутри блока try. Это синтаксический анализ, который может вызвать исключение. –

+0

@RahulSharma * Однако, поскольку значение a определено внутри раздела try, компилятор сообщает мне, что a не был инициализирован. Как это исправить? * –

ответ

0

Как @Elliot Frisch сказал, вы можете просто инициализировать значение a (0) и позаботиться о том, чтобы вы не получили неправильных значений из-за неудачного разбора. В вашем случае это, вероятно, означает возвращение/выход из программы с сообщением об ошибке.

Это на самом деле общий шаблон.

import java.util.Scanner; 

public class QuadraticFormula 
{ 
public static void main(String[] args) 
{ 
double a = 0, b, c; 
Scanner reads = new Scanner(System.in); 

System.out.println("General equation: \"ax^2 + bx + c\""); 
System.out.print("Enter value of \"a\": "); 

try { 
    String doubleString = reads.nextLine(); 
    a = Double.parseDouble(doubleString); 
} 
catch (Exception e) { 
    System.out.println("Invalid Data Type. Please enter a number"); 
    return; 
} 
//do work with a 
0

Просто инициализировать при объявлении его:

public static void main(String[] args) 
{ 
    double a = 0.0; 
    double b, c; 
    Scanner reads = new Scanner(System.in); 

Другая вещь, которую вы можете сделать, это объявить как «класса собственности»:

public class QuadraticFormula 
{ 
    protected static double a = 0.0; 

    public static void main(String[] args) 
    { 
     double b, c; 
     Scanner reads = new Scanner(System.in); 
     try { 
      String doubleString = reads.nextLine(); 
      QuadraticFormula.a = Double.parseDouble(doubleString); 
     } 
     catch (Exception e) { 
      System.out.println("Invalid Data Type. Please enter a number"); 
     } 

Пожалуйста, обратите внимание, как класс свойство (a) ДОЛЖНО получить доступ с использованием статической ссылки в main(), поскольку main() является статическим, что нарушает правило Java использования getter/setter для доступа к свойствам класса. Одна вещь, которую я бы порекомендовал вам следует начать, чтобы узнать, как упаковать функциональность класса за пределами основного() ... снаружи статических ссылок ...

import java.util.Scanner; 

public class QuadraticFormula { 

    protected double a = 0.0; 

    public static void main (String[] args) { 
     QuadraticFormula lnewItem = new QuadraticFormula(); 
     try { 
      lnewItem.doSomething(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 


    } 

    public void doSomething() throws Exception { 
     double b, c; 
     Scanner reads = new Scanner(System.in); 

     System.out.println("General equation: \"ax^2 + bx + c\""); 
     System.out.print("Enter value of \"a\": "); 

     try { 
      String doubleString = reads.nextLine(); 
      setA (Double.parseDouble(doubleString)); 
      System.out.println("setA() - [" + getA() + "]"); 
     } 
     catch (Exception e) { 
      System.out.println("Invalid Data Type. Please enter a number"); 
     } 

    } 

    public double getA() { 
     return a; 
    } 

    public void setA (double a) { 
     this.a = a; 
    } 
} 

Пожалуйста, обратите внимание, в последнем разделе кода, все статические ссылки удаляются кроме основного(). Новые методы getter/setter применяются для свойства Class a, тем самым обеспечивая инкапсуляцию данных Java.

-1

вместо этой строки:

double a, b, c; 

просто заменить его следующим образом:

double a=0, b, c; 
0

Есть два исправления для этого, один должен просто вернуться из основного метода, когда исключение броска например:

double a; 
    Scanner reads = new Scanner(System.in); 

    System.out.println("General equation: \"ax^2 + bx + c\""); 
    System.out.print("Enter value of \"a\": "); 

    try { 
     String doubleString = reads.nextLine(); 
     a = Double.parseDouble(doubleString); 
    } 
    catch (Exception e) { 
     System.out.println("Invalid Data Type. Please enter a number"); 
     return; 
    } 

Другой вариант, указанный другими, дает «а» начальное значение. Я бы предложил инициализировать его как NaN (Not a Number), а затем проверить, что он был правильно инициализирован, прежде чем использовать его так:

double a = Double.NaN; 
    Scanner reads = new Scanner(System.in); 

    System.out.println("General equation: \"ax^2 + bx + c\""); 
    System.out.print("Enter value of \"a\": "); 

    try { 
     String doubleString = reads.nextLine(); 
     a = Double.parseDouble(doubleString); 
    } 
    catch (Exception e) { 
     System.out.println("Invalid Data Type. Please enter a number"); 
    } 

    if(Double.isNaN(a)){ 
     System.out.println("Variable 'a' is invalid, please enter a valid number."); 
    } 
    else { 
     double result = 2 * a; 
    } 
Смежные вопросы