Java代码处缓冲区中的意外值

Java代码处缓冲区中的意外值,java,Java,Deitele书中的简单程序,读取5个整数,程序应打印包含该数量的相邻星号的行。即(如果num=5,则输出*****)。 我已经在C++中测试了同样的解决方案,而且效果不错。然而,这里的缓冲区保存着奇怪的值(50?)。 我认为问题在于使用缓冲区,但是我想知道为什么会发生这种情况 /* * To change this template, choose Tools | Templates * and open the template in the editor. */ package

Deitele书中的简单程序,读取5个整数,程序应打印包含该数量的相邻星号的行。即(如果num=5,则输出*****)。 我已经在C++中测试了同样的解决方案,而且效果不错。然而,这里的缓冲区保存着奇怪的值(50?)。 我认为问题在于使用缓冲区,但是我想知道为什么会发生这种情况

   /*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication1;
import java.io.*;
import java.util.Date;
/**
 * Program that reads five numbers and print starts equal to each number 
 *
 * @author Hassan
 */
public class JavaApplication1 

{


    public static void main(String[] args) 
    {
       int num ; 
       java.io.InputStreamReader  ins= new InputStreamReader(System.in);
       java.io.BufferedReader bfr = new BufferedReader (ins);

       try
       {


       for(int i=0;i<5;i++)
       {
           System.out.println("Please Enter a number");

           num = bfr.read(); 

       System.out.print(num);


             for(int j=0;j<num;j++)
                {   System.out.print("* ");  }
                  System.out.println("\n");


       }    
       } 

       catch(Exception E )
       {System.out.println(E.getMessage());  }



    }
}
/*
*要更改此模板,请选择工具|模板
*然后在编辑器中打开模板。
*/
包javaapplication1;
导入java.io.*;
导入java.util.Date;
/**
*读取五个数字并按每个数字开始打印的程序
*
*@作者哈桑
*/
公共类JavaApplication1
{
公共静态void main(字符串[]args)
{
int-num;
java.io.InputStreamReader ins=新的InputStreamReader(System.in);
java.io.BufferedReader bfr=新的BufferedReader(ins);
尝试
{

对于(int i=0;i您的代码未编译:

  • 使用
    /
    而不是
    \\
  • 您的花括号未对齐,这会造成混淆并可能导致错误
  • 写评论时,请确保在新行中关闭括号(否则它就是评论的一部分)
  • 解决这三个问题,你的程序就会工作

    更新
    JasonD是对的,改变:

    num = bfr.read();
    
    致:

    原因是你在读一个字符,ascii中的“0”是48,“1”是49等等,所以如果你希望输入的范围是0-9,你应该减去48,这样就行了


    如果要处理大于9的数字,则必须使用
    readLine()
    并解析输入的
    字符串

    您正在读取一个字节,该字节将只是第一个可用字符的ascii值。50在ascii中为“2”。您可能要读取并解析作为文本输入的数字


    如果使用
    readLine()
    而不是
    read()
    ,将其转换为
    字符串
    ,则可以使用
    Integer.parseInt()
    获取实际值。

    也许我只是在复制代码时错误地格式化了代码,因为它是在NetBeans上编译和工作的。我会编辑它now@HSN修复这三个问题使它在我的机器上编译和运行,首先阅读BufferedReader和INPtWruter-Read类。你可以考虑它打开一个“插入管道”,在那里你可以“插入”。一些数据(在您的int类型示例中)。如果数据读取错误,则会捕获异常,我认为在您的示例中更正确的是IOException类。E是exception类的实例,getMessage()是是此类的一个方法。但是,在现代方法中,您使用Scanner类从键盘输入不同类型的数据。@PhilipWhitehouse是的,那:)@HSN这似乎是一个新问题。以下是您的代码版本,其中包含建议的更改,似乎有效:
    num = bfr.read()-48;