Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
尝试重新启动Java程序时遇到问题_Java - Fatal编程技术网

尝试重新启动Java程序时遇到问题

尝试重新启动Java程序时遇到问题,java,Java,在查找了许多重启Java程序的方法之后,while循环似乎是最简单的选择。下面是我正在尝试的一个基本计算器程序的示例: import java.util.Scanner; class a { public static void main(String args[]){ boolean done = false; int oper; Scanner input = new Scanner(System.in); System.out.println("McMack

在查找了许多重启Java程序的方法之后,while循环似乎是最简单的选择。下面是我正在尝试的一个基本计算器程序的示例:

import java.util.Scanner;
class a {
public static void main(String args[]){
    boolean done = false;
    int oper;
    Scanner input = new Scanner(System.in);
    System.out.println("McMackins Calc v2.0 (Now with fewer crashes!)");
    while (!done)
    {
    System.out.println("What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):");
    while (!input.hasNextInt()){
        System.out.println("Enter a valid integer.");
        input.next();
    }
    oper = input.nextInt();
    switch (oper){
    case 0:
        done = true;
        break;
    case 1:
        add addObject = new add();
        addObject.getSum();
        break;
    case 2:
        sub subObject = new sub();
        subObject.getDifference();
        break;
    case 3:
        times multObject = new times();
        multObject.getProduct();
        break;
    case 4:
        divide divObject = new divide();
        divObject.getQuotient();
        break;
    case 5:
        remain remObject = new remain();
        remObject.getRemainder();
        break;
    case 6:
        avg avgObject = new avg();
        avgObject.getAvg();
        break;
    case 7:
        interest intObject = new interest();
        intObject.getInterest();
        break;
    default:
        System.out.println("Invalid entry.");
        break;
    }
    }
    input.close();
}
}
然而,这似乎在第一次循环结束时抛出了一个NosTouchElementException,并使程序崩溃。该类的功能是获取用户的初始输入,以确定要使用的类,该类将确定要执行的数学运算。没有
while(!done)
循环,一切正常

用法示例:

McMackins Calc v2.0 (Now with fewer crashes!)
What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):
1
How many addends?
1
Enter your numbers now.
1
You have entered 1 addend.
The sum is: 1.0
What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):
Enter a valid integer.
Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Unknown Source)
    at java.util.Scanner.next(Unknown Source)
    at a.main(a.java:13)
我也尝试过让其他类引用这个类,但是因为main是一个静态方法,所以我无法按照我想要的方式访问它

请注意,我是一个Java初学者,这就是为什么我的程序非常简单的原因,所以如果可以的话,请尽量保持简单,或者发布代码,然后详细解释它的含义,这样我不仅可以解决这个问题,还可以解决未来的问题

谢谢大家!

编辑:

在我的编辑器中,代码的格式更好。当我把它贴在这里时,大括号出现在奇怪的位置

由于显然
a
编写正确,因此这是我的
add
类。希望这能澄清一些事情

import java.util.Scanner;
public class add {
public void getSum(){
    Scanner input = new Scanner(System.in);
    double total, addend;
    int entries, count;
    total = 0;
    count = 0;
    System.out.println("How many addends?");
    while (!input.hasNextInt()){
        System.out.println("Enter a valid integer.");
        input.next();
    }
    entries = input.nextInt();
    System.out.println("Enter your numbers now.");

    while (count < entries){
        while (!input.hasNextDouble()){
            System.out.println("Enter a valid number.");
            input.next();
        }
        addend = input.nextDouble();
        total = total + addend;
        count++;
        if (count == 1){
            System.out.println("You have entered " + count + " addend.");
        }else if (count > entries){
            System.out.println("You have entered too many addends! Contact program developer.");
        }else{
            System.out.println("You have entered " + count + " addends.");
        }
    }
    System.out.println("The sum is: " + total);
    input.close();
}
}
import java.util.Scanner;
公共类添加{
公共无效getSum(){
扫描仪输入=新扫描仪(System.in);
两倍总和,加数;
int条目,计数;
总数=0;
计数=0;
System.out.println(“有多少个加数?”);
而(!input.hasNextInt()){
System.out.println(“输入有效整数”);
input.next();
}
entries=input.nextInt();
System.out.println(“立即输入您的号码”);
while(计数<条目){
而(!input.hasNextDouble()){
System.out.println(“输入有效数字”);
input.next();
}
加数=输入.nextDouble();
总计=总计+加数;
计数++;
如果(计数=1){
System.out.println(“您已输入”+count+“加数”);
}else if(计数>条目){
System.out.println(“您输入了太多的加数!请与程序开发人员联系”);
}否则{
System.out.println(“您已经输入了”+count+“加数”);
}
}
System.out.println(“总和为:“+总计”);
input.close();
}
}

使用
bufferedreader
inputstream
而不是Scanner类。这个类创建了很多bug和错误,因为有时候它需要更多的参数,这是您所期望的。 此外:

您使用的
hasNextInt
方法错误,请尝试使用布尔值和
input来简化while循环。next()
应替换为
input.nextLine()

另外,您应该检查,如果用户在while循环和it范围中键入integer而不是string或其他内容。如果一切正常,您应该将布尔值更改为true,并使其退出while循环

public static void main(String args[]){
    boolean done = false;
    int oper;
    Scanner input = new Scanner(System.in);
    System.out.println("McMackins Calc v2.0 (Now with fewer crashes!)");

    while (!done) {
        System.out.println("What operation? (0 for quit, 1 for add, 2 for subtract, 3 for multiply, 4 for divide, 5 for divide with remainder, 6 for average, 7 for account interest):");
        while (!input.hasNextInt()){
            System.out.println("Enter a valid integer.");
            input.next();
        }
        oper = input.nextInt();
        switch (oper){
        case 0:
            done = true;
            break;
        case 1:
            System.out.println("1");
            break;
        case 2:
            System.out.println("2");
            break;
        case 3:
            System.out.println("3");
            break;
        case 4:
            System.out.println("4");
            break;
        case 5:
            System.out.println("5");
            break;
        case 6:
            System.out.println("6");
            break;
        case 7:
            System.out.println("7");
            break;
        default:
            System.out.println("Invalid entry.");
            break;
        }
    }
    input.close();
}
这似乎对我有效,所以可能错误与您自己的类(add、divide)等有关

另外,在创建自己的类时,最好保持惯例,将第一个字母大写,例如“add”应该是“add”

通过构建一个包含add方法、subtract方法等的通用“Operations”类,您可能会使它更易于阅读

编辑: 请尝试以下添加方法:

public static int add() {
        Scanner s = new Scanner(System.in);
        int counter = 0;

        System.out.println("How many numbers to add?");
        int numCount = s.nextInt();

        for(int i = 0; i < numCount; i++) {
            System.out.println("enter number");
            counter += s.nextInt();
        }

        return counter;
    }
publicstaticintadd(){
扫描仪s=新的扫描仪(System.in);
int计数器=0;
System.out.println(“要添加多少个数字?”);
int numCount=s.nextInt();
for(int i=0;i
对于想知道如何解决这个问题的未来用户,通过一些重新编程,我发现我的问题是在循环结束之前关闭
输入
变量。通过让程序无限期重新启动,并在完成后仅关闭
input
,此程序工作正常


感谢Benjamin的回复,我目前正在通过
for
循环清理和缩短我的代码。

发布异常情况如何?您能更好地格式化代码吗。缩进是错误的,不清楚while在哪里结束。谢谢你的贡献。创建一个通用操作类听起来不是个坏主意。结果是这样的,因为我只是想练习和很多课程一起工作,这样我就习惯了。我可以发布我的
add
类,如果它有助于找出我把事情搞砸的地方。没问题!是的,发布你的添加类,我来看看。很可能是因为它预期的是一个提前的整数,或者相反。Add类现在出现在主帖子中。为上面的Add方法添加了我自己的实现。与您的类似,但没有所有令人困惑的变量,虽然loopsEfficient就是这样,但它假设用户只想添加整数。此外,大量的while循环有时也会被忽略。他们检查以确保输入是有效的,并告诉他们是否输入了错误的内容。如果没有它们,如果输入字符串而不是数字,程序就会崩溃。
public static int add() {
        Scanner s = new Scanner(System.in);
        int counter = 0;

        System.out.println("How many numbers to add?");
        int numCount = s.nextInt();

        for(int i = 0; i < numCount; i++) {
            System.out.println("enter number");
            counter += s.nextInt();
        }

        return counter;
    }