1

我正在尝试使用扫描仪在 JFrame 中绘制一个矩形,但出现以下错误:

 Exception in thread "main" java.util.InputMismatchException
 at java.util.Scanner.throwFor(Unknown Source)
 at java.util.Scanner.next(Unknown Source)
 at java.util.Scanner.nextInt(Unknown Source)
 at java.util.Scanner.nextInt(Unknown Source)
 at DrawerAutoRect.main(DrawerAutoRect.java:39)

我的这个程序的目标是选择要绘制的对象的类型,即:线条、矩形、椭圆,然后输入参数,即如果我正在绘制的矩形,输入将是r, 200,200,400,400并且它绘制一个矩形与 JFrame 上的这些尺寸。然后我只需输入“end”,它就会等待输入和绘制对象。

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.util.Scanner;
import javax.swing.JFrame;

public class DrawerAutoRect extends JFrame {
    public DrawerAutoRect(){
    setSize(1020,1020);
}

public static void paint(Graphics g, int a, int b,int c, int d)
{
   Graphics2D g2 = (Graphics2D)g;
   g2.drawRect(a, b, c, d);
}

public static void main(String[] args) {
    int x1 = 100;
    int x2 = 100;
    int y1 = 50;
    int y2 = 50;
    Scanner s = new Scanner(System.in);
    String dim = s.next();
    while(dim!="end"){
        if(dim.equals("r")){
            x1 = s.nextInt();
            y1 = s.nextInt();
            x2 = s.nextInt();
            y2 = s.nextInt();
        }
    }
    paint(null, x1, y1, x2, y2);
    DrawerAutoRect r = new DrawerAutoRect();
    r.setDefaultCloseOperation(EXIT_ON_CLOSE);
    r.setVisible(true);
    //r.pack();
    r.setTitle("Tutorial");
}
4

1 回答 1

1

问题是您的输入不仅包含您要查找的标记,而且显然还包含逗号空格

因此,您必须告诉您Scanner使用特定的分隔符以了解他必须在this上标记您的输入流String

我建议您使用以下正则表达式作为您的分隔符Scanner

,\s*|\s+

这会将您的输入拆分为:

  • 任何逗号,最后是一些空格,或
  • 至少一个空格。

考虑这个示例代码:

try (final Scanner s = new Scanner(System.in)) {
    s.useDelimiter(",\\s*|\\s+");

    String dim;
    do {
        dim = s.next();
        if (dim.equals("r")) {
            System.out.println(s.nextInt());
            System.out.println(s.nextInt());
            System.out.println(s.nextInt());
            System.out.println(s.nextInt());
        }
    } while (!dim.equals("end"));
}

只需输入:

r 1, 2, 3, 4, end

...在控制台上,我得到以下输出:

1
2
3
4

... 有用!

另外,作为旁注,我想指出,为了比较JavaString中的 s ,您应该使用该方法,而不是原始比较器。String#equals

因此,您应该使用(就像我在示例代码中所做的那样)!dim.equals("end")而不是dim != "end".

于 2014-08-05T04:44:46.633 回答