android findbugs官方文档,Android代码质量 FindBugs 规则

FindBugs

规则

FindBugs是基于Bug

Patterns概念,查找javabytecode(.class文件)中的潜在bug,主要检查bytecode中的bug

patterns,如NullPoint空指针检查、没有合理关闭资源、字符串相同判断错(==,而不是equals)等

一、Security 关于代码安全性防护

1.Dm: Hardcoded constant database password (DMI_CONSTANT_DB_PASSWORD)

代码中创建DB的密码时采用了写死的密码。

2.Dm: Empty database password (DMI_EMPTY_DB_PASSWORD)

创建数据库连接时没有为数据库设置密码,这会使数据库没有必要的保护。

3.HRS: HTTP cookie formed from untrusted input (HRS_REQUEST_PARAMETER_TO_COOKIE)

此代码使用不受信任的HTTP参数构造一个HTTP Cookie。

4.HRS: HTTP Response splitting vulnerability (HRS_REQUEST_PARAMETER_TO_HTTP_HEADER)

在代码中直接把一个HTTP的参数写入一个HTTP头文件中,它为HTTP的响应暴露了漏洞。

5.SQL: Nonconstant string passed to execute method on an SQL statement (SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE)

该方法以字符串的形式来调用SQLstatement的execute方法,它似乎是动态生成SQL语句的方法。这会更容易受到SQL注入攻击。

6.XSS: JSP reflected cross site scripting vulnerability (XSS_REQUEST_PARAMETER_TO_JSP_WRITER)

在代码中在JSP输出中直接写入一个HTTP参数,这会造成一个跨站点的脚本漏洞。

二、Experimental

1.LG: Potential lost logger changes due to weak reference in OpenJDK (LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE)

OpenJDK的引入了一种潜在的不兼容问题,特别是,java.util.logging.Logger的行为改变时。它现在使用内部弱引用,而不是强引用。–logger配置改变,它就是丢失对logger的引用,这本是一个合理的变化,但不幸的是一些代码对旧的行为有依赖关系。这意味着,当进行垃圾收集时对logger配置将会丢失。例如:

public static void initLogging() throws Exception {

Logger logger = Logger.getLogger("edu.umd.cs");

logger.addHandler(new FileHandler()); // call to change logger configuration

logger.setUseParentHandlers(false); // another call to change logger configuration

}

该方法结束时logger的引用就丢失了,如果你刚刚结束调用initLogging方法后进行垃圾回收,logger的配置将会丢失(因为只有保持记录器弱引用)。

public static void main(String[] args) throws Exception {

initLogging(); // adds a file handler to the logger

System.gc(); // logger configuration lost

Logger.getLogger("edu.umd.cs").info("Some message"); // this isn't logged to the file as expected

}

2.OBL: Method may fail to clean up stream or resource (OBL_UNSATISFIED_OBLIGATION)

这种方法可能无法清除(关闭,处置)一个流,数据库对象,或其他资源需要一个明确的清理行动。

一般来说,如果一个方法打开一个流或其他资源,该方法应该使用try / finally块来确保在方法返回之前流或资源已经被清除了。这种错误模式基本上和OS_OPEN_STREAM和ODR_OPEN_DATABASE_RESOURCE错误模式相同,但是是在不同在静态分析技术。我们正为这个错误模式的效用收集反馈意见。

三、Bad practice代码实现中的一些坏习惯

1.AM: Creates an empty jar file entry (AM_CREATES_EMPTY_JAR_FILE_ENTRY)

调用putNextEntry()方法写入新的 jar 文件条目时立即调用closeEntry()方法。这样会造成JarFile条目为空。

2.AM: Creates an empty zip file entry (AM_CREATES_EMPTY_ZIP_FILE_ENTRY)

调用putNextEntry()方法写入新的 zip 文件条目时立即调用closeEntry()方法。这样会造成ZipFile条目为空。

3.BC: Equals method should not assume anything about the type of its argument (BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS)

equals(Object o)方法不能对参数o的类型做任何的假设。比较此对象与指定的对象。当且仅当该参数不为 null,并且是表示与此对象相同的类型的对象时,结果才为 true。

4.BC: Random object created and used only once (DMI_RANDOM_USED_ONLY_ONCE)

随机创建对象只使用过一次就抛弃

5.BIT: Check for sign of bitwise operation (BIT_SIGNED_CHECK)

检查位操作符运行是否合理

((event.detail & SWT.SELECTED) > 0)

If SWT.SELECTED is a negative number, this is a candidate for a bug. Even when SWT.SELECTED is not negative, it seems good practice to use '!= 0' instead of '> 0'.

6.CN: Class implements Cloneable but does not define or use clone method (CN_IDIOM)

按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的),以获得有关重写此方法的详细信息。此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的,应该实现此接口的类应该使用公共方法重写 Object.clone

7.CN: clone method does not call super.clone() (CN_IDIOM_NO_SUPER_CALL)

一个非final类型的类定义了clone()方法而没有调用super.clone()方法。例如:B扩展自A,如果B中clone方法调用了spuer.clone(),而A中的clone没有调用spuer.clone(),就会造成结果类型不准确。要求A的clone方法中调用spuer.clone()方法。

8.CN: Class defines clone() but doesn't implement Cloneable (CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE)

类中定义了clone方法但是它没有实现Cloneable接口

9.Co: Abstract class defines covariant compareTo() method (CO_ABSTRACT_SELF)

抽象类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型,如下例:

int compareTo(T o)  比较此对象与指定对象的顺序。

10.Co: Covariant compareTo() method defined (CO_SELF_NO_OBJECT)

类中定义了多个compareTo()方法,正确的是覆写Comparable中的compareTo方法,方法的参数为Object类型

11.DE: Method might drop exception (DE_MIGHT_DROP)

方法可能抛出异常

12.DE: Method might ignore exception (DE_MIGHT_IGNORE)

方法可能忽略异常

13.DMI: Don't use removeAll to clear a collection (DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION)

不要用removeAll方法去clear一个集合

14.DP: Classloaders should only be created inside doPrivileged block (DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED)

类加载器只能建立在特殊的方法体内

15.Dm: Method invokes System.exit(...) (DM_EXIT)

在方法中调用System.exit(...)语句,考虑用RuntimeException来代替

16.Dm: Method invokes dangerous method runFinalizersOnExit (DM_RUN_FINALIZERS_ON_EXIT)

在方法中调用了System.runFinalizersOnExit 或者Runtime.runFinalizersOnExit方法,因为这样做是很危险的。

17.ES: Comparison of String parameter using == or != (ES_COMPARING_PARAMETER_STRING_WITH_EQ)

用==或者!=方法去比较String类型的参数

18.ES: Comparison of String objects using == or != (ES_COMPARING_STRINGS_WITH_EQ)

用==或者!=去比较String类型的对象

19.Eq: Abstract class defines covariant equals() method (EQ_ABSTRACT_SELF)

20.Eq: Equals checks for noncompatible operand (EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS)

equals方法检查不一致的操作。两个类根本就是父子关系而去调用equals方法去判读对象是否相等。

public boolean equals(Object o) {

if (o instanceof Foo)

return name.equals(((Foo)o).name);

else if (o instanceof String)

return name.equals(o);

else return false;

21.Eq: Class defines compareTo(...) and uses Object.equals() (EQ_COMPARETO_USE_OBJECT_EQUALS)

类中定义了compareTo方法但是继承了Object中的compareTo方法

22.Eq: equals method fails for subtypes (EQ_GETCLASS_AND_CLASS_CONSTANT)

类中的equals方法可能被子类中的方法所破坏,当使用类似于Foo.class == o.getClass()的判断时考虑用this.getClass() == o.getClass()来替换

23.Eq: Covariant equals() method defined (EQ_SELF_NO_OBJECT)

类中定义了多个equals方法。正确的做法是覆写Object中的equals方法,它的参数为Object类型的对象。

24.FI: Empty finalizer should be deleted (FI_EMPTY)

为空的finalizer方法应该删除。一下关于finalizer的内容省略

25.GC: Unchecked type in generic call (GC_UNCHECKED_TYPE_IN_GENERIC_CALL)

This call to a generic collection method passes an argument while compile type Object where a specific type from the generic type parameters is expected. Thus, neither the standard Java type system nor static analysis can provide useful information on whether the object being passed as a parameter is of an appropriate type.

26.HE: Class defines equals() but not hashCode() (HE_EQUALS_NO_HASHCODE)

方法定义了equals方法却没有定义hashCode方法

27.HE: Class defines hashCode() but not equals() (HE_HASHCODE_NO_EQUALS)

类定义了hashCode方法去没有定义equal方法

28.HE: Class defines equals() and uses Object.hashCode() (HE_EQUALS_USE_HASHCODE)

一个类覆写了equals方法,没有覆写hashCode方法,使用了Object对象的hashCode方法

29.HE: Class inherits equals() and uses Object.hashCode() (HE_INHERITS_EQUALS_USE_HASHCODE)

子类继承了父类的equals方法却使用了Object的hashCode方法

30.IC: Superclass uses subclass during initialization (IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION)

子类在父类未初始化之前使用父类对象实例

public class CircularClassInitialization {

static class InnerClassSingleton extends CircularClassInitialization {

static InnerClassSingleton singleton = new InnerClassSingleton();

}

static CircularClassInitialization foo = InnerClassSingleton.singleton;

}

31.IMSE: Dubious catching of IllegalMonitorStateException (IMSE_DONT_CATCH_IMSE)

捕捉违法的监控状态异常,例如当没有获取到对象锁时使用其wait和notify方法

32.ISC: Needless instantiation of class that only supplies static methods (ISC_INSTANTIATE_STATIC_CLASS)

为使用静态方法而创建一个实例对象。调用静态方法时只需要使用类名+静态方法名就可以了。

33.It: Iterator next() method can't throw NoSuchElementException (IT_NO_SUCH_ELEMENT)

迭代器的next方法不能够抛出NoSuchElementException

34.J2EE: Store of non serializable object into HttpSession (J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION)

在HttpSession对象中保存非连续的对象

35.JCIP: Fields of immutable classes should be final (JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS)

The class is annotated with net.jcip.annotations.Immutable, and the rules for that annotation require that all fields are final. .

36.NP: Method with Boolean return type returns explicit null (NP_BOOLEAN_RETURN_NULL)

返回值为boolean类型的方法直接返回null,这样会导致空指针异常

37.NP: equals() method does not check for null argument (NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT)

变量调用equals方法时没有进行是否为null的判断

38.NP: toString method may return null (NP_TOSTRING_COULD_RETURN_NULL)

toString方法可能返回null

39.Nm: Class names should start with an upper case letter (NM_CLASS_NAMING_CONVENTION)

类的名称以大写字母名称开头

40.Nm: Class is not derived from an Exception, even though it is named as such (NM_CLASS_NOT_EXCEPTION)

类的名称中含有Exception但是却不是一个异常类的子类,这种名称会造成混淆

41.Nm: Confusing method names (NM_CONFUSING)

令人迷惑的方面命名

42.Nm: Field names should start with a lower case letter (NM_FIELD_NAMING_CONVENTION)

非final类型的字段需要遵循驼峰命名原则

43.Nm: Use of identifier that is a keyword in later versions of Java (NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER)

验证是否是java预留关键字

44.Nm: Use of identifier that is a keyword in later versions of Java (NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER)

验证是否时java中的关键字

45.Nm: Method names should start with a lower case letter (NM_METHOD_NAMING_CONVENTION)

方法名称以小写字母开头

46.Nm: Class names shouldn't shadow simple name of implemented interface (NM_SAME_SIMPLE_NAME_AS_INTERFACE)

实现同一接口实现类不能使用相同的名称,即使它们位于不同的包中

47.Nm: Class names shouldn't shadow simple name of superclass (NM_SAME_SIMPLE_NAME_AS_SUPERCLASS)

继承同一父类的子类不能使用相同的名称,即使它们位于不同的包中

48.Nm: Very confusing method names (but perhaps intentional) (NM_VERY_CONFUSING_INTENTIONAL)

很容易混淆的方法命名,例如方法的名称名称使用使用大小写来区别两个不同的方法。

49.Nm: Method doesn't override method in superclass due to wrong package for parameter (NM_WRONG_PACKAGE_INTENTIONAL)

由于错误引用了不同包中相同类名的对象而不能够正确的覆写父类中的方法

import alpha.Foo;

public class A {

public int f(Foo x) { return 17; }

}

import beta.Foo;

public class B extends A {

public int f(Foo x) { return 42; }

public int f(alpha.Foo x) { return 27; }

}

50.ODR: Method may fail to close database resource (ODR_OPEN_DATABASE_RESOURCE)

方法中可能存在关闭数据连接失败的情况

51.OS: Method may fail to close stream (OS_OPEN_STREAM)

方法中可能存在关闭流失败的情况

52.OS: Method may fail to close stream on exception (OS_OPEN_STREAM_EXCEPTION_PATH)

方法中可能存在关闭流时出现异常情况

53.RC: Suspicious reference comparison to constant (RC_REF_COMPARISON_BAD_PRACTICE)

当两者为不同类型的对象时使用equals方法来比较它们的值是否相等,而不是使用==方法。例如比较的两者为java.lang.Integer, java.lang.Float

54.RC: Suspicious reference comparison of Boolean values (RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN)

使用== 或者 !=操作符来比较两个 Boolean类型的对象,建议使用equals方法。

55.RR: Method ignores results of InputStream.read() (RR_NOT_CHECKED)

InputStream.read方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户读取少量字符请求的情况。

56.RR: Method ignores results of InputStream.skip() (SR_NOT_CHECKED)

InputStream.skip()方法忽略返回的多个字符,如果对结果没有检查就没法正确处理用户跳过少量字符请求的情况

57.RV: Method ignores exceptional return value (RV_RETURN_VALUE_IGNORED_BAD_PRACTICE)

方法忽略返回值的异常信息

58.SI: Static initializer creates instance before all static final fields assigned (SI_INSTANCE_BEFORE_FINALS_ASSIGNED)

在所有的static final字段赋值之前去使用静态初始化的方法创建一个类的实例。

59.Se: Non-serializable value stored into instance field of a serializable class (SE_BAD_FIELD_STORE)

非序列化的值保存在声明为序列化的的非序列化字段中

60.Se: Comparator doesn't implement Serializable (SE_COMPARATOR_SHOULD_BE_SERIALIZABLE)

Comparator接口没有实现Serializable接口

61.Se: Serializable inner class (SE_INNER_CLASS)

序列化内部类

62.Se: serialVersionUID isn't final (SE_NONFINAL_SERIALVERSIONID)

关于UID类的检查内容省略

63.Se: Class is Serializable but its superclass doesn't define a void constructor (SE_NO_SUITABLE_CONSTRUCTOR)

子类序列化时父类没有提供一个void的构造函数

64.Se: Class is Externalizable but doesn't define a void constructor (SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION)

Externalizable 实例类没有定义一个void类型的构造函数

65.Se: The readResolve method must be declared with a return type of Object. (SE_READ_RESOLVE_MUST_RETURN_OBJECT)

readResolve从流中读取类的一个实例,此方法必须声明返回一个Object类型的对象

66.Se: Transient field that isn't set by deserialization. (SE_TRANSIENT_FIELD_NOT_RESTORED)

This class contains a field that is updated at multiple places in the class, thus it seems to be part of the state of the class. However, since the field is marked as transient and not set in readObject or readResolve, it will contain the default value in any deserialized instance of the class.

67.SnVI: Class is Serializable, but doesn't define serialVersionUID (SE_NO_SERIALVERSIONID)

一个类实现了Serializable接口但是没有定义serialVersionUID类型的变量。序列化运行时使用一个称为 serialVersionUID 的版本号与每个可序列化类相关联,该序列号在反序列化过程中用于验证序列化对象的发送者和接收者是否为该对象加载了与序列化兼容的类。如果接收者加载的该对象的类的 serialVersionUID 与对应的发送者的类的版本号不同,则反序列化将会导致 InvalidClassException。可序列化类可以通过声明名为 "serialVersionUID" 的字段(该字段必须是静态 (static)、最终 (final) 的 long 型字段)显式声明其自己的 serialVersionUID: ANY-ACCESS-MODIFIER static final long serialVersionUID = 42L;

68.UI: Usage of GetResource may be unsafe if class is extended (UI_INHERITANCE_UNSAFE_GETRESOURCE)

当一个类被子类继承后不要使用this.getClass().getResource(...)来获取资源

四、Correctness关于代码正确性相关方面的

1.BC: Impossible cast (BC_IMPOSSIBLE_CAST)

不可能的类转换,执行时会抛出ClassCastException

2.BC: Impossible downcast (BC_IMPOSSIBLE_DOWNCAST)

父类在向下进行类型转换时抛出ClassCastException

3.BC: Impossible downcast of toArray() result (BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY)

集合转换为数组元素时发生的类转换错误。

This code is casting the result of calling toArray() on a collection to a type more specific than Object[], as in: String[] getAsArray(Collection c) {

return (String[]) c.toArray();

}

This will usually fail by throwing a ClassCastException. The toArray() of almost all collections return an Object[]. They can't really do anything else, since the Collection object has no reference to the declared generic type of the collection. The correct way to do get an array of a specific type from a collection is to use c.toArray(new String[]); or c.toArray(new String[c.size()]); (the latter is slightly more efficient). 4.BC: instanceof will always return false (BC_IMPOSSIBLE_INSTANCEOF)

采用instaneof方法进行比较时总是返回false。前提是保证它不是由于某些逻辑错误造成的。

5.BIT: Incompatible bit masks (BIT_AND)

错误的使用&位操作符,例如(e & C)

6.BIT: Check to see if ((...) & 0) == 0 (BIT_AND_ZZ)

检查恒等的逻辑错误

7.BIT: Incompatible bit masks (BIT_IOR)

错误的使用|位操作符,例如(e | C)

8.BIT: Check for sign of bitwise operation (BIT_SIGNED_CHECK_HIGH_BIT)

检查逻辑运算符操作返回的标识。例如((event.detail & SWT.SELECTED) > 0),建议采用!=0代替>0

9.BOA: Class overrides a method implemented in super class Adapter wrongly (BOA_BADLY_OVERRIDDEN_ADAPTER)

子类错误的覆写父类中用于适配监听其他事件的方法,从而导致当触发条件发生时不能被监听者调用

10.Bx: Primitive value is unboxed and coerced for ternary operator (BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR)

在三元运算符操作时如果没有对值进行封装或者类型转换。例如:b ? e1 : e2

11.DLS: Dead store of class literal (DLS_DEAD_STORE_OF_CLASS_LITERAL)

以类的字面名称方式为一个字段赋值后再也没有去使用它,在1.4jdk中它会自动调用静态的初始化方法,而在jdk1.5中却不会去执行。

12.DLS: Overwritten increment (DLS_OVERWRITTEN_INCREMENT)

覆写增量增加错误i = i++

13.DMI: Bad constant value for month (DMI_BAD_MONTH)

hashNext方法调用next方法。

14.DMI: Collections should not contain themselves (DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES)

集合没有包含他们自己本身。

15.DMI: Invocation of hashCode on an array (DMI_INVOKING_HASHCODE_ON_ARRAY)

数组直接使用hashCode方法来返回哈希码。

int [] a1 = new int[]{1,2,3,4};

System.out.println(a1.hashCode());

System.out.println(java.util.Arrays.hashCode(a1));

16.DMI: Double.longBitsToDouble invoked on an int (DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT)

17.DMI: Vacuous call to collections (DMI_VACUOUS_SELF_COLLECTION_CALL)

集合的调用不能被感知。例如c.containsAll(c)总是返回true,而c.retainAll(c)的返回值不能被感知。

18.Dm: Can't use reflection to check for presence of annotation without runtime retention (DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION)

Unless an annotation has itself been annotated with @Retention(RetentionPolicy.RUNTIME), the annotation can't be observed using reflection (e.g., by using the isAnnotationPresent method). .

19.Dm: Useless/vacuous call to EasyMock method (DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD)

While ScheduledThreadPoolExecutor inherits from ThreadPoolExecutor, a few of the inherited tuning methods are not useful for it. In particular, because it acts as a fixed-sized pool using corePoolSize threads and an unbounded queue, adjustments to maximumPoolSize have no useful effect.

20.EC: equals() used to compare array and nonarray (EC_ARRAY_AND_NONARRAY)

数组对象使用equals方法和非数组对象进行比较。即使比较的双方都是数组对象也不应该使用equals方法,而应该比较它们的内容是否相等使用java.util.Arrays.equals(Object[], Object[]);

21.EC: equals(...) used to compare incompatible arrays (EC_INCOMPATIBLE_ARRAY_COMPARE)

使用equls方法去比较类型不相同的数组。例如:String[] and StringBuffer[], or String[] and int[]

22.EC: Call to equals() with null argument (EC_NULL_ARG)

调用equals的对象为null

23.EC: Call to equals() comparing unrelated class and interface (EC_UNRELATED_CLASS_AND_INTERFACE)

使用equals方法比较不相关的类和接口

24.EC: Call to equals() comparing different interface types (EC_UNRELATED_INTERFACES)

调用equals方法比较不同类型的接口

25.EC: Call to equals() comparing different types (EC_UNRELATED_TYPES)

调用equals方法比较不同类型的类

26.EC: Using pointer equality to compare different types (EC_UNRELATED_TYPES_USING_POINTER_EQUALITY)

This method uses using pointer equality to compare two references that seem to be of different types. The result of this comparison will always be false at runtime.

27.Eq: equals method always returns false (EQ_ALWAYS_FALSE)

使用equals方法返回值总是false

28.Eq: equals method always returns true (EQ_ALWAYS_TRUE)

equals方法返回值总是true

29.Eq: equals method compares class names rather than class objects (EQ_COMPARING_CLASS_NAMES)

使用equals方法去比较一个类的实例和类的类型

30.Eq: Covariant equals() method defined for enum (EQ_DONT_DEFINE_EQUALS_FOR_ENUM)

This class defines an enumeration, and equality on enumerations are defined using object identity. Defining a covariant equals method for an enumeration value is exceptionally bad practice, since it would likely result in having two different enumeration values that compare as equals using the covariant enum method, and as not equal when compared normally. Don't do it.

31.Eq: equals() method defined that doesn't override equals(Object) (EQ_OTHER_NO_OBJECT)

类中定义的equals方法时不要覆写equals(Object)方法

32.Eq: equals() method defined that doesn't override Object.equals(Object) (EQ_OTHER_USE_OBJECT)

类中定义的equals方法时不要覆写Object中的equals(Object)方法

33.Eq: equals method overrides equals in superclass and may not be symmetric (EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC)

34.Eq: Covariant equals() method defined, Object.equals(Object) inherited (EQ_SELF_USE_OBJECT)

类中定义了一组equals方法,但是都是继承的java.lang.Object class中的equals(Object)方法

35.FE: Doomed test for equality to NaN (FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER)

This code checks to see if a floating point value is equal to the special Not A Number value (e.g., if (x == Double.NaN)). However, because of the special semantics of NaN, no value is equal to Nan, including NaN. Thus, x == Double.NaN always evaluates to false. To check to see if a value contained in x is the special Not A Number value, use Double.isNaN(x) (or Float.isNaN(x) if x is floating point precision).

36.FS: Format string placeholder incompatible with passed argument (VA_FORMAT_STRING_BAD_ARGUMENT)

错误使用参数类型来格式化字符串

37.FS: The type of a supplied argument doesn't match format specifier (VA_FORMAT_STRING_BAD_CONVERSION)

指定的格式字符串和参数类型不匹配,例如:String.format("%d", "1")

38.FS: MessageFormat supplied where printf style format expected (VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED)

但用String的format方法时实际调用了MessageFormat中干的格式化方法而引起格式化结果出错。

39.FS: More arguments are passed than are actually used in the format string (VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED)

使用String的format方法时有非法的参数也经过了格式化操作。

40.FS: Illegal format string (VA_FORMAT_STRING_ILLEGAL)

格式化String对象语句错误

41.FS: Format string references missing argument (VA_FORMAT_STRING_MISSING_ARGUMENT)

String的format操作缺少必要的参数。

42.FS: No previous argument for format string (VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT)

格式字符串定义错误,例如:formatter.format("%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值