在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不存在。
就像@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;
}
给'a'一个默认初始值;考虑是否有例外。没有默认值,“a”根本没有价值。 –
@ElliottFrisch我不认为这是OP的要求。这是扫描仪的输入,无法在任何地方使用。 @Caroline'String doubleString = reads.nextLine();'不会抛出异常,因此不必在try块内部。这是可能抛出异常的解析。 –
@RahulSharma *但是,由于a的值是在try部分内部定义的,编译器告诉我a没有被初始化。如何解决这个问题?* –