nextLine () работает неправильно.. (Java)

#java

#java

Вопрос:

Я создал объект с именем «Skill» и основную программу. Навык:

     import java.util.*;
class Skill
{
    static Scanner reader = new Scanner(System.in);
    public int iStar;
    public int iColor; //0-White, 1-Red, 2-Orange, 3-Grenn, 4-DeepSkyBlue, 5-Blue.
    public String sName;
    public String sText;
    public String sLink;
    public String sRank;
    Skill()
    {
        System.out.println ( "What is the skill name?" );
        this.sName = reader.nextLine();
        System.out.println ( "Insert the icon's link please" );
        this.sLink = reader.nextLine();
        System.out.println ( "Which rank is recommended to this skill?" );
        this.sRank = reader.nextLine();
        System.out.println ( "Explanation about the skill" );
        this.sText = reader.nextLine();
        System.out.println ( "Text color?"   "n"   "1-Red, 2-Orange, 3-Green, 4-DeepSkyBlue, 5-Blue." );
        this.iColor = reader.nextInt();
        System.out.println ( "How many stars would you like? (0-2)" );
        this.iStar = reader.nextInt();
    }
    void FixMe (  )
    {
        int iNum = 0;
        System.out.println ( "Which one of the data would you like to change?"   "n"   "0-non of them, 1-Star, 2-Color, 3-Name, 4-Text, 5-Link, 6-Rank." );
        do
        {
            switch ( reader.nextInt() )
            {
                case 0: iNum = 0;
                                break;
                case 1: this.iStar = reader.nextInt();
                               iNum = 0;
                                break;
                case 2: this.iColor = reader.nextInt();
                               iNum = 0;
                                break;
                case 3: this.sName = reader.nextLine();
                               iNum = 0;
                                break;
                case 4: this.sText = reader.nextLine();
                               iNum = 0;
                                break;
                case 5: this.sLink = reader.nextLine();
                                iNum = 0;
                                break;
                case 6: this.sRank = reader.nextLine();
                               iNum = 0;
                                break;
                default: System.out.println ( "Error, Please insert again the number of the data (!) ." );
                                    iNum = 1;
                                    break;
            }
        }
        while ( iNum == 1 );
    }
    String ImageIt (  )
    {
        String sPro = "[IMG]"   this.sLink   "[/IMG]";
        return sPro;
    }
    String BoldIt (  )
    {
        String sPro = "[B]Rank "   this.sRank   "[/B]";
        return sPro;
    }
    String UnderscoreIt (  )
    {
        String sPro = "[U]"   this.sName   "[/U]";
        return sPro;
    }
    String ColorIt ( String sNoob )
    {
        String sPro = "[COLOR="";
        int iNum = 0;
        do
        {
            switch ( this.iColor )
            {
                case 1: sPro = "Red";
                                iNum = 0;
                                break;
                case 2: sPro = "Orange";
                                iNum = 0;
                                break;
                case 3: sPro = "Green";
                                iNum = 0;
                                break;
                case 4: sPro = "DeepSkyBlue";
                                iNum = 0;
                                break;
                case 5: sPro = "Blue";
                                iNum = 0;
                                break;
                default: System.out.println ( "Error, Please insert again the number of the color (!) ." );
                                    this.iColor = reader.nextInt();
                                    iNum = 1;
                                    break;
            }
        }
        while ( iNum == 1 );
        sPro = ""]"   sNoob   "[/COLOR]";
        return sPro;
    }
    String WhiteColorIt ( int FirstOrSecond )
    {
        String sPro = "[COLOR="White"]";
        if ( FirstOrSecond == 1 )
        {
            int iNum = 0;
            do
            {
                if ( this.iStar >= 3 || this.iStar < 0 )
                {
                    System.out.println ( "Error, Please insert again the number of the stars (!) ." );
                    this.iStar = reader.nextInt();
                    iNum = 1;
                }
                else
                {
                    iNum = 0;
                }
            }
            while ( iNum == 1 );
            iNum = 2 - this.iStar;
            for ( ; iNum != 0; iNum-- )
                sPro = "*";
            sPro = "[/COLOR]";
        }
        else
            sPro = "**[/COLOR]";
        return sPro;
    }
    /*הפעולה הראשית*/
    String ExtractMe()
    {
        String sPro = "";
        String sTemp = "";
        switch ( this.iStar )
        {
            case 0: sPro = this.WhiteColorIt ( 2 )   " ";
                           sTemp = this.ImageIt()   " "   this.UnderscoreIt();
                           sTemp = this.ColorIt ( sTemp );
                           sPro = sTemp;
                           break;
            case 1: sPro = this.WhiteColorIt ( 1 );
                           sTemp = "* "   this.ImageIt()   " "   this.UnderscoreIt();
                           sTemp = this.ColorIt ( sTemp );
                           sPro = sTemp;
                           break;
            case 2: sPro = "** "   this.ImageIt()   " "   this.UnderscoreIt();
                           sPro = this.ColorIt ( sPro );
                           break;
            default:
                                break;
        }
        sPro = " - "   this.sText   "n";
        sPro = this.WhiteColorIt ( 2 )   " "   this.BoldIt()   ".";
        return sPro;
    }
}
  

Главная:

     import java.util.*;
public class Main
{
    static Scanner reader = new Scanner(System.in);
    public static void main(String[] args)
    {
        String sPro = "";
        Skill Winner01 = new Skill();
       System.out.println ( "האם אתה רוצה לתקן את אחד הנתונים?"   "n"   "1-Yes, 2-No");
       if ( reader.nextInt() == 1 )
                Winner01.FixMe();
       sPro = Winner01.ExtractMe()   "n";
       Skill Winner02 = new Skill();
       System.out.println ( "האם אתה רוצה לתקן את אחד הנתונים?"   "n"   "1-Yes, 2-No");
       if ( reader.nextInt() == 1 )
                Winner02.FixMe();
       sPro = Winner02.ExtractMe()   "n";
        System.out.println ( sPro );
    }
}
  

Я использую BlueJ, и пока я пытался протестировать программу, я приобрел 2 навыка. поэтому я дважды использовал «Skill()», но во второй раз reader.nextLine() не сработал.

Комментарии:

1. каким образом nextLine() это работает неправильно? Что происходит? Чего вы ожидаете, что произойдет?

2. Причиной может быть то, что сканер статичен и используется совместно обоими экземплярами вашего класса навыков.

Ответ №1:

Вы создаете два экземпляра класса scanner, оба прикреплены к System.in . Один находится в вашем Main классе, другой — в Skill классе. Эти два мешают при попытке чтения из одного и того же входного потока.

Возможным решением является создание экземпляра только одного сканера и передача его в качестве аргумента конструктору вашего Skill класса.

Комментарии:

1. Можете ли вы объяснить мне, как это изменить? Я не научился делать больше вещей со сканером и как с ним работать.

2. A) избавьтесь от строки static Scanner reader = new Scanner(System.in); внутри класса Skill . Б) измените ваш конструктор с Skill(){...} на Skill(Scanner reader){...} . C) Измените new Skill() на new Skill(reader) в вашем основном классе. D) сделайте то же самое для FixMe .