Java:扫描器编译错误

我目前正在研究一个简单的战列舰游戏。 我使用Java扫描器从用户获取坐标。 如果我在eclipse中运行这段代码,我不会遇到任何错误,一切都很好。 但如果我在另一个编译器中运行代码(例如http://www.compilejava.net/),则会出现此错误:

线程“main”中的异常java.util.NoSuchElementException:在SchiffeVersenken.main的SchiffeVersenken.attack(SchiffeVersenken.java:57)处的java.util.Scanner.nextLine(Scanner.java:1540)处未找到任何行(SchiffeVersenken.java: 38)

所以我知道问题是与扫描仪和“.nextLine()”方法有关,但即时通讯新的Java,而不是如何解决这个问题。

import java.util.Scanner;

public class SchiffeVersenken {

    // "Lebenspunkte" der Spieler
    static int userLife = 30;
    static int enemyLife = 30;
    // Spielbrett beider Spieler
    static char[][] user = {
        { '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '#', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '#', '#', '#', '#', '#', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '#', '#', '#', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '#', '#', '#', '#', '#' },
        { '.', '.', '.', '.', '.', '#', '#', '#', '#', '#' },
        { '.', '.', '.', '.', '.', '#', '#', '#', '#', '#' }
    };
    static char[][] enemy = {
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' },
        { '.', '.', '.', '.', '.', '.', '.', '.', '.', '.' }
    };

    public static void main(String[] args) {

        Scanner s = new Scanner(System.in);
        while(userLife > 0 && enemyLife > 0) {
            attack(s);
            defend(s);
        }
        s.close();

        if(userLife == 0) {
            System.out.println("Alle Schiffe sind versenkt worden. Sie haben leider verloren!");
        } else {
            System.out.println("Alle Schiffe des Gegners sind versenkt worden. Sie haben gewonnen!");
        }

    }

    public static void attack(Scanner s) {

        String inputHit;
        int inputRow, inputColumn;

        System.out.println("Bitte Zeile des Ziels eingeben: ");
        inputRow = Integer.parseInt(s.nextLine());
        System.out.println("Bitte Spalte des Ziels eingeben: ");
        inputColumn = Integer.parseInt(s.nextLine());
        System.out.println("Koordinaten des Zeils: " + inputRow + "/" + inputColumn);

        System.out.println("Ziel getroffen? (y oder n)");
        inputHit = s.nextLine();

        if(inputHit.equals("y") | inputHit.equals("n")) {
            if(inputHit.equals("y")) {
                enemy[inputRow][inputColumn] = 'X';
                System.out.println("Boom! Guter Schuss!");
                enemyLife -= 1;
            } else {
                enemy[inputRow][inputColumn] = 'O';
                System.out.println("Oh je! Leider nicht getroffen!");
            } 
        } else {
            System.out.println("Ziel getroffen? (y oder n)");
            inputHit = s.next();
        }

        print(enemy);

    }

    public static void defend(Scanner s) {

        int inputRow, inputColumn;

        System.out.println("Bitte Zeile des Ziels eingeben: ");
        inputRow = Integer.parseInt(s.nextLine());
        System.out.println("Bitte Spalte des Ziels eingeben: ");
        inputColumn = Integer.parseInt(s.nextLine());
        System.out.println("Koordinaten des Zeils: " + inputRow + "/" + inputColumn);

        if(user[inputRow][inputColumn] == '#') {
            user[inputRow][inputColumn] = 'X';
            System.out.println("Boom! Schiff unter Beschuss!");
            userLife -= 1;
        } else {
            user[inputRow][inputColumn] = 'O';
            System.out.println("Gott sei Dank! Nicht getroffen!");
        }

        print(user);

    }

    public static void print(char[][] grid) {

        System.out.println(" 0123456789");
        for(int i=0; i<10; i+=1) {
            System.out.print(i);
            for (int j=0; j<10; j+=1) {
                System.out.print(grid[i][j]);
                if(j == 9) {
                    System.out.println();
                }
            }
        }
        System.out.println();

    }

}

如果代码在IDE中运行,那么一切都是正确的。 Scanner的工作方式是:

Scanner input = new Scanner(System.in); 

System是java.lang.System ,它具有静态对象,即InputStream类型,out和err类型为PrintStream

基本上System.in是InputStream对象,它连接到它应该预期数据的来源 - 它们是Keyboard。

在线IDE应该被设计为它应该模拟InputStream和Input等通过键盘输入和你提到的编译Java,它没有正确运行你的代码有问题模拟输入从键盘扫描仪的方式期待它。 错误不是来自您的代码,而是来自在线编译器。 为了证明我的观点,请尝试在此链接中找到的其他Java编译器。

如果您想了解Scanner如何在java中工作,请参阅我在Stackoverflow中给出的这个问题的答案。 在那里我详细解释了什么是Scanner,它是如何工作的。

链接地址: http://www.djcxy.com/p/17217.html

上一篇: Java: scanner compile errors

下一篇: Code to read from a file and then putting it into a constructor won't work