-3

我有这个错误:

输出显示来自程序的 3 个 C。我自己输入了“12.34”。

预期的输出应该是:

C
C
C
12.34
12.34 is the first string
12.34 is the second string

12.34 应该被转换为 double 但我得到了奇怪的字符。

在此处输入图像描述

我无法找到解决方案。我尝试了不同的方法,但仍然遇到同样的错误。

这是我的程序:

    int ch = 0;
    int i = 0;
    int counter = 0;
    int sum = 0;
    double[] conArray = new double[3];
    //string[] conArray = new string[3];
    double dataDbl;
    String dataStr = null;
    double data = 0;
    String s = "C";
    String t = "Hello";
    //StringBuffer sb = new StringBuffer();
    //String con = "C";
    ////System.out.println("Starting!");
    System.out.println("C");
    buffer.setLength(0);
    System.out.println("C");
    buffer.setLength(0);
    System.out.println("C");

    buffer.delete(0,buffer.length());


    while (i < 300) {
        ch = inStream.read();
        if ((ch == '\r') || (ch == '\n')) {
            i = 300;
        }
        buffer.append((char)ch);
        i++;
    }
    dataStr = buffer.toString();
    dataDbl = Double.parseDouble(dataStr.trim());

    conArray[counter] = dataDbl;

    outStream.writeChars(dataStr);
    System.out.println(" is the first string"); 

    outStream.writeDouble(conArray[counter]);
    System.out.println(" is the first data");  

    buffer.delete(0,buffer.length());
    counter++;

我找到了修复,这里是:

                int trash = 0;
                trash = inStream.read();
                System.out.println("C");
                while (true) {
                    ch2 = inStream.read();
                    if ((ch2 == '\r') || (ch2 == '\n')) {
                        break;
                    }

                    if (ch2 != 32) {
                       sb.append((char)ch2);
                    }

我在 inStream 之前放置了一个称为垃圾的整数来删除空格或不需要的字符。工作完美。问题是串行设备用 and 终止其输出。这两个留在缓冲区中未读,因此当读取下一个数据时,实际上什么都没有,因此在 Double.parseDouble(dataStr.trim()); 处发生错误。

4

2 回答 2

2

在解析之前,将您尝试解析的字符串以 double 形式打印到控制台:

System.out.println(dataStr.trim());

它应该显示一个可解析的双精度(在您的情况下为 12.34),否则您在从流中获取它时做错了

于 2012-05-06T18:33:50.007 回答
1

退出循环的最简单方法是使用break;在您的情况下,您确保循环将退出,但您仍将添加\r或添加\n到不属于数字的缓冲区中。

单步调试器是找出代码在做什么的最快方法,尤其是当它没有按照您的预期执行时。在 IDE 中,它通常是 Run 旁边的按钮。

于 2012-05-06T18:10:46.593 回答