0

我有一个基本的二次公式程序,但是如果输入了除双精度以外的任何值,我已经修改了程序的开始到结束。但是,因为我已经这样做了,所以我似乎无法使用程序中其他任何地方输入的值。这是前几行:

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 尚未初始化。我该如何解决?

编辑:我确实想使用用户在程序中输入的数据(存储为双字符串)——但是一个数字。我的直接问题是编译器错误,但有没有办法使用输入的信息,即使它在 try 块内?因为当我试图将 double a 等同于块外的 double doubleString 时,它说 doubleString 不存在。

4

4 回答 4

0

声明时只需初始化 a :

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

您可以做的另一件事是将 a 声明为“类属性”:

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

请注意如何必须在 main() 中使用静态引用访问 Class 属性 (a),因为 main() 是静态的,这违反了使用 getter/setter 访问 Class 属性的 Java 规则。我建议您开始学习如何在 main() 之外打包 Class 功能...在静态引用之外...

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() 之外,所有的静态引用都被删除了。为 Class 属性 a 提供了新的 getter/setter 方法,从而强制执行 Java 的数据封装。

于 2016-04-21T23:11:31.833 回答
0

有两个解决方法,一个是在抛出异常时简单地从 main 方法返回,如下所示:

    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;
    }
于 2016-04-21T23:20:58.597 回答
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
于 2016-04-21T22:59:14.570 回答
-1

而不是这一行:

double a, b, c; 

只需将其替换为:

double a=0, b, c; 
于 2016-04-21T23:16:50.527 回答