Android-FindBugs中常见的bug级别与问题说明

Java代码弱点与修复之——STCAL: Static use of type Calendar or DateFormat 避免静态使用 Calendar 和 DateFormat 类型可以提高程序的健壮性和可维护性,以及避免多线程环境下可能出现的错误。 阅读详情

前言

这两天组长要求对项目的代码进行一遍检查。于是我就使用了IDE的finfBugs插件检查了一遍代码,在这里记录下findbugs中常见的bug描述。
FindBugs问题汇总
检查工具:FindBugs
Bug级别
  1. Scariest(最高bug级别)
  2. Scary
  3. Troubling
  4. Of Concern
Scariest描述
  • Useless self-operation(描述:自我赋值,将值自己赋值给了自己,不知道为什么会有这种奇怪的东西)。 比如:在某个类中的set方法 set(String s) {this.s = this.s}属于此类问题。
  • Synchronization on field in futile attempt to guard that field(描述:同步字段可能无效)。
  • Method ignores return values (描述:忽略了方法的返回值)。 比如:String类型的字段在调用replace方法后没有重新赋值。
  • Comparing incompatible types for equality:call equals() to comparing different types(描述:equals方法比较了不同的类型)。 比如:"".equals(productNameList),其中productNameList是数组类型。
  • Suspicious reference comparison(描述:可疑的引用类型比较,该类型不适用于==比较)。 比如:Duble.valueOf(v) == Double.valueOf("0"),Double.ValueOf方法返回的类型是有个Double引用,不建议两个引用之间直接使用==。
  • No relationship between generic parameter and method argument(描述:使用Collection类中的contains\get\remove方法比较时,两个参数类型不致)。
  • Bad comparison if int value long constant(描述:int类型的值与long类型的值进行了比较)。
  • Very confusing method names(描述:十分困惑的方法名,方法名的首字母不应该用 大写)。
  • Scary级别
    • Null pointer dereference(空指针间接引用)。
      1. Null value is guaranteed to be dereferenced(描述:保证取消引用null)。某个字段可能为null。 Possible null pointer dereference(可能为null引用)。在某些类中的对象可能为null。
      2. Method call passes null for non-null parameter(描述:方法调用对非null参数调用null)。f = Float.parseFloat(value)中value可能为null。
      3. A known null value is checked to see if it is an instance of a type(描述:检查已知的null值以查看它是否是类型的实例)。比如:if(info == null&&info instance SomeClass)。
      4. Null pointer dereference(描述:空指针间接引用)。比如:if(v == null && ..)在之后的逻辑中为null的v字段可能被引用。
      5. Non-virtual method call passes null for non-null parameter(描述:对要求非null参数的方法传递了null参数)。比如:某个方法中传递了null参数。
      6. Read of unwritten field(描述:不能写入的字段读取)。比如:在某个方法中Button未经初始化就是设置属性。
    • Synchronization performed on java.util.CopyOnWriteArrayList(描述:对CopyOnWriteArrayList上了锁)。比如:对线程安全容器又加了一次锁由于CopyOnWriteArrayList已支持同步,不需要加锁。
    • Incorrect lazy initialization and update of static field(描述:静态字段不正确的懒加载和更新)。比如:建议在返回单例实例的时候建议加同步锁。
    • Repeated conditional test(描述:重复的判断条件)。比如:if(index - 1|| index - 1)判断条件重复。
    • Doomed test for equality to NaN(描述:与NaN进行比较)。比如:if(d == 0 || d == Double.NaN)由于NaN的特殊语义,没有值等于NaN,包括NaN本身,所以d == Double.NaN 总是为false。
    • Int value cast to float then passed to Math.round(描述:int类型的值先转型为float然后再传入Math.round方法)。
    • Call to static DateFormat(描述:调用了静态的DateFormat)。由于DateFormate不是线程安全的,推荐使用内部属性的方式调用。
    • Bad Comparison of nonnegative value with negative constant or zero(描述:非负数和0或者负数的比较)。比如:if(list != null && list.size()>0)其中list.size()返回值大于等于0 永真。
    • Infinite loop(描述:无限循环)。比如:某个方法产生了递归无限循环调用。
    • Invocation of toString on an array(描述:数组类型调用了toString方法)。建议使用Array.toString方法。
    • A Parameter is dead upon entry to a method but overwritten.(描述:参数在进入方法时就被杀死了,这里的情况是参数被计算赋值没有被使用)。
    • Covariant equals() method defined,Object.equals() inherited.(描述:应该重写object.equals()方法)。比如:重写了equals()方法,但参数不是Object类型,这里的建议是重写Object.equals()方法。
    • Format String problem.(描述:String格式化问题)。比如:String.format方法需要6个参数,但只传了5个。
    • Useless assignment in return(描述:在return语句中进行了没用的赋值)。比如:return a= b.getBoolean(),a不需要再赋值。
    • Class defines field that mask a superclass field.(子类声明的参数覆盖了父类相同名称的参数)。
    Troubling级别
    • Class defines equals() and uses Object.hashCode().(描述:类重写了equals()的同时也需要使用hashCode()方法)。
    • NullCheck of value previously dereferenced.(描述:在进行null检查时已经使用,不需要在这里进行判空)。
    • Non-transient non-serializable instance field in serializable class.(描述:在可序列化的类中成员变量的引用没有实现序列化接口,可能造成NotSerializableException异常)。
    • Null Pointer dereferenced.(null值可能被引用)。
    • Class names should not shadow simple name of superclass.(描述:某个类的名字和父类名称一样)。
    • Class defines clone() but does not implement cloneable.(描述:某个类重写了clone()方法却没有实现Cloneable接口)。
    • Condition has no effect(描述:判断条件没有作用)。比如:在某个方法中,i已经经过计算,if(i == -1)这个条件永假。
    • Possible double check of field.(描述:某个属性存在双重检查)。比如:在某个中,getInstance对instance进行了两次判空。
    • Unsynchronized get method,Synchronized set method(描述:get方法不是同步的,但set方法是同步的)。
    • Comparison of String parameter using == or !=(描述:对String类型的数据使用==或者!=进行了比较)。
    • Dead store to local variable that shadows field.(描述:计算之后的值赋值到局部变量)。比如:局部变量被赋值后没有被使用。
    • static use of type Calendar or DateFormat(描述:使用了静态的Calendar或者DateFormat)。因为Calendar和DateFormat不是线程安全的,使用静态数据可能造成数据不一致。
    • Check for oddness that will not work for negative numbers.(描述:检查奇数的方法使用x % 2 == 1在x为负数是无效)。这里建议使用x & 1 == 1或者 x % 2 != 0来判断。
    • An increment to a volatile field is not atomic.(描述:volatile修饰的字段++操作不具有原子性)。
    • Unwritten field.(描述:没有被写入的字段)。这里是有些字段没有被赋值或者初始化,当读取字段时还是原来的值。
    Of Concern级别
    • Confusing method name.(描述:令人迷惑的方法名)
      1. Method names should start with a lower case letter.(描述:方法名应该以小写开头)。
      2. Class names should start with a upper case letter.(描述:类名应该以大写开头)。
      3. Field names should start with a lowercase letter.(描述:属性名应该以小写开头)。
    • Dead store to local variable that shadows field.(描述:计算之后的值赋值到局部变量,但局部变量没有被使用)。
    • Switch case falls through.(描述:switch的用例判定)
      1. Switch statement found where one case falls through to the next case.(描述:switch语句也在下一条运行)。这里是在case语句中没有使用break关键字,所以也会运行下一条语句。
      2. Switch statement found where default case is missing.(描述:switch没有default语句)。
    • May expose internal representation by incorporating reference to mutable object.(描述:可以通过合并对可变对象的引用来公开内部表示)。这里是指的是setter方法使用引用传递,外部对象的修改也可能造成内部对象的修改。
    • Exception is caught when Exception is not thrown.(描述:方法使用捕获异常对象的try-catch块,但不会在try块中抛出异常)。这里指的是建议使用特定异常。
    • Unsatisfied obligation to clean up stream or resource.(描述:不能保证资源和流被正确释放)。这里指的是有些文件流资源可能不能被释放。
    • Bad use of return value from method.(描述:没有使用方法的返回值)。这里指的是方法的返回值没有被使用,只执行了方法。
    • Redundant comparison to null.(描述:与null的冗余比较)。这里是对一些字段进行了重复的null检查。
    • Serializable class with no Version ID.(描述:序列化类没有定义序列化id)。某个类没有定义序列化id。
    • Questionable Boxing of primitive value.(描述:自动拆箱问题)。这里指的是在程序中存在int i = Integer.valueOf(str) 。其中Integer.valueOf()返回Integer对象。
    • Dubious method used.(描述:可疑的方法调用)。这里指的是一些方法不适当的使用。
    • Method uses the same code for two branch.(描述:方法中两个判断分支有相同的操作)。这里只的是if{}else{}中的逻辑相同。
    • Integral division result cast to double or float.(描述:处罚结果变为double或float)。这里指的是int进行除法时的转型。比如:int x = 2; int y = 5; // 错误的方式:double value1 = x / y = 0.0;

    // 正确的方式:
    double value2 = x / (double) y = 0.4

  • Useless code.(描述:没用处的代码)。这里主要是指空逻辑 比如:if{}。
  • Bad cast of Object reference.(描述:不良的转型)。这里有相同类型的对象使用instance关键字进行了判断,或者没有被instanceof判断。
  • Method concatenates strings using + in a loop.(描述:在循环中使用+操作符对string进行拼接)。
  • Mutable static field.(描述:可变的静态字段)。这里指的是不推荐static字段是可变的。
  • Load of known null value.(描述:使用了已知的null值)。比如:在NewsGundongPinnedSectionListView类中initSectionAndTimeData方法中,if(c == null && ''.equals(c))。
  • Useless control flow.(描述:没有用处的控制语句)。这里指的是if空逻辑或者for空逻辑。
  • Format string should use %n rather than \n.(描述:String格式化语句中应该用%n代替\n)。
  • Method ignores results of InputStream.read().(描述:方法中忽略了read()方法的返回结果)。这里指的是read()方法返回的结果在方法中没有被使用。
  • Test for floating point equality.(描述:使用了==或!=来判断float或double)。这里指的是float或double计算结构有精度,相同的计算不一定得到相同的结果,应用在判断是加上一定的精度范围,比如:Math.abs(x - y) > 0.0000001。
  • Enum field is public or mutable.(描述:枚举字段是public和可变的)。这里建议使用final的。
  • Private method is never used.(描述:私有方法没有被调用)。
  • Write to static field from instance method.(描述:从实例方法写入静态字段)。这里是说在多个实例操作时可能不造成其他结果。
  • Double assignment of field.(描述:同一个字段两次赋值)。指的是在初始化是对同一个字段进行了两次相同的初始化。
  • Vacuous bit mask operation on integer value.(描述:整数值上的空位掩码操作)。
  • Method may fail to close stream.(描述:流资源可能关闭失败)。这里有些流资源没有主动关闭。
  • Inefficient use of ketSet iterator instead of entrySet iterator.(描述:低效使用keySet迭代器而不是entrySet迭代器)。这里建议使用entrySet迭代器。共61条。
  • Class implements Cloneable but does not define or use clone method.(描述:类实现了Cloneable接口没有实现clone方法)。
  • Method might ignore exception.(描述:方法可能忽略异常)。这里指的是异常没有进行处理。
  • Potentially dangerous use of non-short-circuit logic.(描述:存在非短路逻辑风险)。这里指的是返回的boolean类型使用&操作符进行处理。
  • Unwritten field.(描述:没有被写入的字段)。这里是有些字段没有被赋值或者初始化,当读取字段时还是原来的值。
  • Unread field.(描述:没有被读取的字段)。这里是指没有被使用过的字段,建议删除。
  • Should be static inner class.(描述:应该使用静态内部类)。这里指的是建议使用静态内部类。
  • Unused field.(描述:没有被使用的字段)。这里是指定义的字段没有被调用,建议删除。
  • Unread field:should this field be static?(描述:有些私有final类型的字段是否需要设置为静态的)。
  • Inconsistent synchronization.(描述:不一致的同步)。这里是因为设置变量时进行同步而在读取时没有进行同步。
  • 总结

    以上就是在本次扫描代码后遇到的大多数问题。FindBugs中的问题描述还是比较精准的,而且其中也有很多有用的建议,值得采用并利用到代码中。
JAVA:Spring Boot 集成 FindBugs 实现代码质量检测 FindBugs是一款Java静态代码分析工具,通过字节码分析检测潜在bug和代码缺陷。它能发现空指针异常、无效赋值、类型转换问题等常见错误,并提供四个级别的Bug分类。FindBugs支持IDE插件安装和Maven集成,通过静态分析提高代码质量。文章介绍了其工作原理、安装配置方法,并列举了7类典型Bug(如空指针、资源泄漏等)的示例代码和修复方案,帮助开发者提前发现并修复问题,降低生产环境Bug率。 阅读详情

相关推荐

Rust 与 C/C++:Rust 比 C/C++ 更好还是只是“技能问题”?

对于许多嵌入式系统开发人员而言,的崛起似乎掀起了一股不小的浪潮,特别是在相较于传统的语言,Rust的“内存安全”优势让人眼前一亮。然而,是否可以将Rust作为C/C++的替代品?或者说,Rust是否真的比C/C++更好,抑或它只是一个“技能问题”呢?在嵌入式开发的领域,我观察到,尽管Rust在一些高性能、内存安全敏感的场景中受到了广泛推崇,但它在实际应用中的普及度,特别是在嵌入式领域,依然有限。今天,我会从多个角度探讨这个问题,并且分享一些对于Rust、C/C++以及嵌入式系统开发的个人见解。

qq_63315166的博客 1300

Non-transient non-serializable instance field in serializable class sonar

Non-transient non-serializable instance field in serializable class     sonar 检测出的代码规范 在使用sonar 检测代码质量的时候发现很多Non-transient non-serializable instance field in serializable class  (序列化的类中存在非序列化的接口或非短暂性

cucmber的专栏 7401

海康Camera MVS Linux SDK二次开发封装ROS packge过程记录(c++)

https://www.hikrobotics.com/machinevision/service/download?module=0

weixin_41965898的博客 2万+

DM_DEFAULT_ENCODING问题修改

OutputStream os = socket.getOutputStream(); PrintStream out = new PrintStream(); 这段代码会出现DM_DEFAULT_ENCODING的问题 即:依赖默认编码 找到了对一个方法的调用,该方法将执行字节到字符串(或字符串到字节)转换,并将假定默认平台编码是合适的。这将导致应用程序行为因平台而异。使用替代API并显式指定字符集名称或字符集对象。 需要改成 BufferedWriter 这种形式: OutputStreamWrite

weixin_42340194的博客 3141

Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包

联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装。 工作的电脑不能上外网,所以不能通过直接输入pip命令来安装。 环境:电脑上已经安装了Python(没有安装的请参考其他教程)。 Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包的步骤如下: ...

dayou7738的博客 4941

Python广度优先搜索BFS - 蓝桥13届省赛污染海域

请问这片N * M海域中有几块是没被污染的独立海域(没被污染的独立海域是指该块海域上下左右被已污染的海域包围,且N * M以外的海域都为已被污染的海域)有一片海域划分为N * M个方格,其中有些海域已被污染(用0表示),有些海域没被污染(用1表示)。第二行开始输入N行,每行M个数字(数字只能为1或者0,1表示没被污染的海域,0表示已被污染的海域)这块4 * 5的海域,有3块海域(绿色)没被污染,因为每一块的上下左右都被污染的海域包围。输出一个整数,表示N * M的海域中有几块是没被污染的独立海域。

m0_69865359的博客 264

FindBugs 汇总(持续修改)

findbus 个人遇到过的记录

qq_37793601的博客 2758

Classic AUTOSAR精讲专栏目录

欢迎大家来到钢琴上的汽车软件创建的《Classic AUTOSAR精讲系列专栏》,期待在这里能够与大家一起进步,分享成功,分享喜悦!下面蓝色的文章标题都是传送门,点击直接跳转到对应文章。

酒无忧的博客 3903

android studio字符串转整型,Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)...

在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降。那么怎么才能找出这些埋在程序里的定时炸弹呢?对程序员来说最头疼的事情莫过于找Bug了,尤其是找自己程序中的Bug,因为人的思维是有误区的,他很容易陷入当时开发程序时的思维,这样就很难发现埋藏在程序中的Bug。接下来就给大家分享一个...

weixin_28996657的博客 702

基于HTML5的酒店在线预订系统设计与实现

1.背景介绍 酒店预订系统,作为现代酒店业务中的重要一环,其便捷性、智能化程度直接影响着酒店的服务质量和经营效果。近年来,随着互联网技术和移动设备的快速发展,以及消费者行为的日益电子化,酒店预订系统也正在经历一场深刻的变革。传统的酒店预订系统往往依赖于复杂的软件安装和硬件设备,而新一代的酒店预订系统则更加强调在线、移动和云端的特性。HTML5作为一种前

AI天才研究院 1909

CVPR 2026 即插即用 | 注意力篇 | MSEF:超轻注意力,空间-通道双分支并行融合,既增强特征又抑制噪声!

Multinex提出了一种超轻量级微光图像增强框架,其核心创新是MSEF模块。MSEF采用双分支并行架构,结合空间局部特征(深度可分离卷积)和全局通道注意力(改进SE),通过Tanh激活实现特征增强与抑制。相比传统注意力模块,MSEF在几乎不增加计算量的情况下显著提升性能,特别适合轻量级网络和边缘设备部署。实验表明,该模块能有效提升PSNR约3dB,同时保持极低的参数量(0.7K-45K)。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 603

【Android开发高级实践】轻松帮你发现Bug(FindBugs在AndroidStudio上的应用)

在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降。那么怎么才能找出这些埋在程序里的定时炸弹呢?

fengyuzhengfan的专栏 1万+

Xilinx DDR3 MIG IP核设计--汇总导航

快速上手Xilinx DDR3 IP核----汇总篇

孤独的单刀 2万+

Android Studio 中的FindBugs插件使用,轻松帮你发现Bug

在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降。那么怎么才能找出这些埋在程序里的定时炸弹呢?   对程序员来说最头疼的事情莫过于找Bug了,尤其是找自己程序中的Bug,因为人的思维是有误区的,他很容易陷入当时开发程序时的思维,这样就很难发现埋藏在程序中的Bug。接下来就给大家分

拼搏的少年的博客 4477

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

FindBugs静态代码分析工具

一、介绍 Findbugs,它是一个静态分析工具,它检查类或者jar文件,将字节码和一组缺陷模式进行对比以发现可能的问题。有了静态分析工具,就可以在不实际运行程序的情况下对软件进行分析。不是通过分析类文件的形式或结构来确定程序的意图,而是通常使用Visitor模式来鉴别代码是否符合一些固定的规范。Findbugs可作为一款插件用在Eclipse或 IntelliJ IDEA环境的编译器上。下面介...

I want to know a little more. 1435

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

轻松帮你发现Bug(FindBugs在AndroidStudio上的应用)

在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降。那么怎么才能找出这些埋在程序里的定时炸弹呢?   对程序员来说最头疼的事情莫过于找Bug了,尤其是找自己程序中的Bug,因为人的思维是有误区的,他很容易陷入当时开发程序时的思维,这样就很难发现埋藏在程序中的Bug。接下来就给大家分

blues的博客 2029

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Android Studio 中的FindBugs插件使用,轻松帮你发现Bug (转)

在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降。那么怎么才能找出这些埋在程序里的定时炸弹呢?   对程序员来说最头疼的事情莫过于找Bug了,尤其是找自己程序中的Bug,因为人的思维是有误区的,他很容易陷入当时开发程序时的思维,这样就很难发现埋藏在程序中的Bug。接下来就给...

SharkArmy 75

FindBugs代码检查工具的使用

FindBugs 它用来查找Java代码中存在的bug。它使用静态分析方法标识出Java程序中上百种潜在的不同类型的错误。 在线安装findbugs:Android Studio->Settigns->Plugins->Browse repositories->search "findBUgs-IDEA"安装重启即可。 FindBugs支持对包级别、项目级别、模块级别、单个文件级别,以及自定义

陈如水的专栏 4056

开发工具&插件 Android Studio FindBugs插件提示信息说明

Android Studio FindBugs插件提示信息说明 Minimum priority to report:根据bug的优先权级别报告bug。 Malicious code vulnerability:恶意代码。 Dodgy code:高危代码。FindBugs团队认为该类型下的问题代码导致bug的可能性很高。 Bad practice:最佳实践反例。这种类别下的代码违反

Yaphet 1729

如何使用FindBugs进行安全扫描

如何使用FindBugs进行安全扫描 前言 随着移动互联网的飞速发展,移动端产品满天飞,深入各行各业,移动端安全已经变得跟PC端安全同等重要地位。但由于移动端自身特性,移动端操作系统以及应用程序的安全性做的还不是很成熟。因此,我们在开发移动端App的时候,要尽量多地避免安全漏洞问题。本文主要是从预防的角度出发,介绍一个静态代码扫描工具,在编译阶段来提前发现代码的安全漏洞。 FindSecurityBugs简介 FindSecurityBugs是Java静态分析工具FindBugs的插件,通过一系列的规则发现

原&点、、 1184

FindBugs的使用

在日常开发过程中难免会因为一时疏忽而留下一些Bug,这些Bug就是埋在程序里的定时炸弹,如果不能及时铲除就会导致程序的不稳定,异常或闪退的现象,从而导致用户的体验的下降。那么怎么才能找出这些埋在程序里的定时炸弹呢?    对程序员来说最头疼的事情莫过于找Bug了,尤其是找自己程序中的Bug,因为人的思维是有误区的,他很容易陷入当时开发程序时的思维,这样就很难发现埋藏在程序中的Bug。接下来就给大

lzq520210的博客 491
上一篇: Java并发编程(三)—队列同步器(AbstractQueuedSynchronizer)
下一篇: HTTP/2简介
Coding-ls
博客等级 码龄11年 41粉丝 61原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值