依赖于默认编码

时间:2015-04-29 12:01:17

标签: java findbugs

我使用FindBugs并且此错误不断生成:

  

依赖于默认编码:

     

发现对一个方法的调用,该方法将执行字节到String(或String to byte)转换,并假设默认平台编码是合适的。 这将导致应用程序行为因平台而异。使用备用API并明确指定charset名称或Charset对象。

我认为这与扫描仪有关,这是我的代码:

package mystack;

 import java.util.*;

  public class MyStack {

    private int maxSize;
    private int[] stackArray;
    private int top;

    public MyStack(int s) {
       maxSize = s;
       stackArray = new int[maxSize];
       top = -1;
    }
    public void push(int j) {
       stackArray[++top] = j;
    }
    public int pop() {
       return stackArray[top--];
    }
    public int peek() {
       return stackArray[top];
    }
    public int min() {
       return stackArray[0];
    }
    public boolean isEmpty() {
       return (top == -1);
    }
    public boolean isFull() {
       return (top == maxSize - 1);
    }


     public static void main(String[] args) {

       Scanner read = new Scanner(System.in);

         char end;

         System.out.println("Please enter the size of the Stack: ");
            int size=read.nextInt();

            MyStack stack = new MyStack(size);

         do{

            if(stack.isEmpty()){
              System.out.println("Please fill the Stack: (PUSH) \nBecause Stack is Empty.");
                 int add;
                 for(int i=0; i<size; i++)
                 {add=read.nextInt();
                   stack.push(add);}
                      }//End of if

          else if(stack.isFull()){
              System.out.println("Do you want to 1)POP 2)Know the Peek 3)Know the Min");
               int option=read.nextInt();
                if(option==1) 
                 stack.pop();

                else if (option==2)
                 System.out.println("The Peek= "+stack.peek());

                else if (option==3)
                 System.out.println("The Min= "+stack.min());

                else System.out.println("Error, Choose 1 or 2 or 3");
                      }//End of if
         else 
            { System.out.println("Do you want to 1)POP 2)Know the Peek 3)Know the Min 4)PUSH");
               int option=read.nextInt();

                 if(option==1)
                     stack.pop();

                 else if (option==2)
                  System.out.println("The Peek= "+stack.peek());

                 else if (option==3)
                  System.out.println("The Min= "+stack.min());

                 else if(option==4)
                   {int add=read.nextInt();
                    stack.push(add);}
                   }//end else

         System.out.print("Stack= ");
          for(int i=0; i<=stack.top; i++)
                 { System.out.print(stack.stackArray[i]+" ");}

         System.out.println();
         System.out.println();

         System.out.println("Repeat? (e=exit)");
          end=read.next().charAt(0);

         System.out.println();
         }while(end!='e');   
    System.out.println("End Of Program");
    }//end main

    }//end MyStack
显然这是一个堆栈,工作正常。

3 个答案:

答案 0 :(得分:4)

FindBugs担心默认的字符编码。如果您在Windows下,则默认字符编码可能是“ISO-8859-1”。如果你在Linux下,它可能是“UTF-8”。如果你在MacOS下,你可能正在使用“MacRoman”。您可以在charset encodings上阅读更多内容,然后点击链接,在available encodings in Java上了解详情。

特别是,此行使用默认平台编码从控制台读取文本:

   Scanner read = new Scanner(System.in);

为确保代码在不同环境中的工作方式相同,FindBugs建议您将其更改为

   Scanner read = new Scanner(System.in, "UTF-8");

(或您最喜欢的编码)。这将保证,给定一个使用编码“UTF-8”的输入文件,无论您执行程序的机器是什么,它都将以相同的方式进行解析。

在您的情况下,您可以安全地忽略此警告,除非您有兴趣将文本文件提供给您的应用程序。

答案 1 :(得分:1)

FindBugs检测到您的Scanner对象使用默认编码来解析InputStream。通常,最好像new Scanner(someInputStreamFromFile, "UTF-8")一样明确地设置编码,以便在不同的环境中具有相同的解析结果。但不是在你的情况下,因为你读取System.io并且没有可靠的方法来检测控制台编码。详情请见java console charset translation

答案 2 :(得分:1)

当您从控制台阅读时,您可以ignore this warning

@SuppressFBWarnings(
        value = "DM_DEFAULT_ENCODING",
        justification = "It's fine for console reads to rely on default encoding")

这种抑制应该是有意义的。我们可能会使用例如Windows中的UTF-8控制台,然后我们不应该依赖new Scanner(System.in);中的默认编码。