在Java中,如何使用程序中其他位置的try/catch块内初始化的变量?

问题描述:

我有一个基本的二次公式程序,但我修改了开始以结束程序,如果任何值以外的双输入。但是,因为我已经这样做了,所以我似乎无法使用程序中任何其他位置输入的值。以下是前几行:在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"); 
    } 

程序的其余部分请求的B和C的值,然后进行二次方程式,重新调整被输入任何方程的根。但是,由于a的值是在try部分内部定义的,编译器告诉我a没有被初始化。我该如何解决?

编辑:我想使用用户在程序中输入的数据(存储为doubleString) - 但是一个数字。我的直接问题是编译器错误,但是有什么方法可以使用输入的信息,即使它在try块内?因为当我试图在块的外面等同double a到double doubleString时,它说doubleString不存在。

+0

给'a'一个默认初始值;考虑是否有例外。没有默认值,“a”根本没有价值。 –

+0

@ElliottFrisch我不认为这是OP的要求。这是扫描仪的输入,无法在任何地方使用。 @Caroline'String doubleString = reads.nextLine();'不会抛出异常,因此不必在try块内部。这是可能抛出异常的解析。 –

+0

@RahulSharma *但是,由于a的值是在try部分内部定义的,编译器告诉我a没有被初始化。如何解决这个问题?* –

就像@Elliot Frisch说,你可以初始化一个值(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 

只是初始化你把它声明:

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()是静态的,这会破坏使用getter/setter访问Class属性的Java规则。有一件事我会建议你应该开始学习如何的主()...静态引用之外外面包类的功能...

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; 
    } 
} 

请注意代码的最后一节,所有的静态引用除main()以外被删除。新的getter/setter方法适用于Class属性a,从而实施Java的数据封装。

,而不是这一行:

double a, b, c; 

只是这种替换:

double a=0, b, c; 

这有两个定位,一个是简单地从你的主要方法返回时,一个例外是抛出像这样:

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; 
    } 

其他人声明的选项是给'a'一个初始值。我建议将它初始化为NaN(不是数字),然后在使用它之前检查它是否已正确初始化,如下所示:

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; 
    }