• 关于

    异常程序可以做什么

    的搜索结果

问题

Java异常的抛出问题

蛮大人123 2019-12-01 19:57:10 911 浏览量 回答数 1

回答

Java异常是一个非常重要的Java基础设施,很多业务系统依赖异常来做流程控制,不管是不是理想的设计,但是很有效果,根据我的经验,为这些问题来给一些输入。1 有没有合适的封装?一般公司会结合自己业务系统的错误码结合来设计异常,每个异常的实例会包含一个错误码,错误码和异常之间可以互相转换。2 对于catch异常return null这样做有什么弊端。这种做法不好,异常不要吃掉,要不处理掉,要不抛出。3 比如io异常要怎么处理。可以优先考虑临时问题重试,或者对IO问题进行描述,影响范围等进行抛出。4 怎么同时代码简洁程度和程序的健壮度。代码其实不怕多,只要合理、清晰就可以,异常处理其实就是为了逻辑处理的代码保持简洁,试想一下没有异常的语言,如果深层次返回一个错误,需要层层退出,效果是很繁琐的。提出这个几个开放的问题,希望得到大牛的回答。工作中遇到太多异常处理不好埋坑的同事,有时都不知道是自己太强人所难还是他们水平太低。

智扬 2019-12-02 01:55:08 0 浏览量 回答数 0

回答

默认情况下,所有用户定义的异常都应继承自Exception。在文档中建议这样做: 异常异常 所有内置的,非系统退出的异常都派生自此类。*所有用户定义的异常也应从此类派生。 PEP 8也建议并鼓励这样做: 从Exception而不是BaseException派生异常。从BaseException的直接继承是为异常保留的,在这些异常中捕获异常几乎总是错误的事情。 *通常,由Exception派生的异常应由常规代码处理。相反,直接从BaseException派生的异常与特殊情况相关。像正常异常一样处理它们会导致意外行为。这就是为什么惯用的“全部捕获”处理程序仅处理Exception的原因: def retry(func): while True: try: return func() except Exception as err: print(f"retrying after {type(err)}: {err}") 直接从BaseException继承的内置异常是KeyboardInterrupt,SystemExit和GeneratorExit,它们与程序,线程或生成器/协程的关闭相关。错误地处理它们会阻止正常关机。 注意,虽然默认值应该是继承自Exception,但是如果有充分的理由可以继承自BaseException。例如,asyncio.CancelledError也继承自BaseException,因为它表示asyncio线程等效项Task的关闭。 回答来源:stackoverflow

is大龙 2020-03-24 21:54:48 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

Windows Phone 7 - 如何退出程序:报错

kun坤 2020-06-20 11:52:16 1 浏览量 回答数 1

回答

先说一下AOP是干什么呢, AOP是面向切面的编程, 通过AOP可以将业务的各个部分进行隔离,从而是各个部分耦合度降低。常用于做日志记录,性能统计,安全控制,事务处理,异常处理等。 接着再介绍几个概念:Joint point:表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等,它自身还可以嵌套其它 joint point。Pointcut:表示一组 joint point,这些 joint point 或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。Advice:Advice 定义了在 pointcut 里面定义的程序点具体要做的操作,它通过 before、after 和 around 来区别是在每个 joint point 之前、之后还是代替执行的代码Advisor: 通知器, 包括通知和切点 结合上面的概念再来看楼主的例子就比较清晰了 定义了切点, 即要拦截哪些操作。 这个例子就是说要拦截com.ace.service.impl这个包下的所有以Impl结尾的所有public方法。 定义了通知器, 该通知器指定了刚刚说的那个切点, 还指定了基于这个切点要做什么操作, 具体的操作逻辑在txAdvice中。

慕之 2019-12-02 01:57:37 0 浏览量 回答数 0

问题

10个Java异常的常见问题:报错

kun坤 2020-06-09 11:37:57 3 浏览量 回答数 1

问题

各种流行的编程风格? 400 报错

爱吃鱼的程序员 2020-06-04 15:18:42 1 浏览量 回答数 1

回答

先来看一段创建文件并写入文本的代码,然后作介绍。 ? 1234567891011121314151617181920212223242526272829303132333435 !/usr/bin/env python 'makeFile.py -- create a file' import os ls = os.linesep get filename while True: fname = raw_input('Input an unused file name >') if os.path.exists(fname): print "ERROR: '%s' already exists" %fname else: break get file content lines all = [] print "nEnter lines (input '.' to quit).n" loop until user terminates input while True: entry = raw_input('>') if entry == '.': break else: all.append(entry) write lines to file with proper line-ending fobj = open(fname, 'w') fobj.writelines(['%s%s' %(x, ls) for x in all]) fobj.close() print 'DONE' if name == '__main__': print 'innter module' 上面的代码用来创建一个新文件并写入文本,第6行给os模块中的linesep起了给别名ls,这样做的好处一方面简化了长长的变量名,另一方面也是主要原因用于提高代码性能,因为访问这个变量时首先要检测os模块,然后再解析linesep,linesep是行结束符标志,linux下是'r',windows下是'rn',用本地变量保存更好。第34行使用了__name__,这主要用于代码内测试,它的值是__main__,但python文件通常作为模块被其它文件import,这时__name__的值是这个模块名,就不会执行模块内的测试代码了。 ? 123456789101112131415161718 !/usr/bin/env python 'readFile.py -- read and display file' get filename fname = raw_input('Enter filename >') print attempt to open file for reading try: fobj = open(fname, 'r') except IOError, e: print "* file open error:", e else: # display contents to the screen for eachLine in fobj: print eachLine, fobj.close() 上面的代码用来读文件并显示其内容到屏幕上,使用了try-except-else异常处理机制。 这里简单介绍下try的工作原理:当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。 1、如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。 2、如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。 3、如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。 总结 以上就是本文关于分享一个简单的python读写文件脚本的全部内容,希望对大家有所帮助。如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

xuning715 2019-12-02 01:10:29 0 浏览量 回答数 0

问题

神马是宕机迁移??---宕机迁移解惑

qilu 2019-12-01 21:03:48 17165 浏览量 回答数 23

问题

python 关闭标准输入输出? 400 报错

爱吃鱼的程序员 2020-06-05 12:07:35 0 浏览量 回答数 1

问题

什么是宕机迁移?

boxti 2019-12-01 21:48:20 2824 浏览量 回答数 0

回答

你这个是window下的?如果是我早忘光了。哈。基本上几年前,我就把“线程”这个概念扔掉了。用进程的构造方式,我们可以讨论讨论中间的逻辑问题。问我线程的任何问题,可权当我不会,因为线程的事情,进程都可以做。所谓线程省资源,更高效,那是基于没有考虑线程额外带来的逻辑的空谈。###### 引用来自“中山野鬼”的答案 你这个是window下的?如果是我早忘光了。哈。基本上几年前,我就把“线程”这个概念扔掉了。用进程的构造方式,我们可以讨论讨论中间的逻辑问题。问我线程的任何问题,可权当我不会,因为线程的事情,进程都可以做。所谓线程省资源,更高效,那是基于没有考虑线程额外带来的逻辑的空谈。 不懂就说你不懂又不会死,别在这里误导新手。线程当然比进程轻量,线程能做的事当然很多进程都做不了,而且楼主发的代码是关于互斥体的与多线程没多大关系,互斥体是跨进程的,你即然这么熟悉多进程,看到一个互斥体的代码却扯了一堆不相关的东西? 而且异常退出关线程、进程啥事?调试方法的问题,你告诉楼主调试中断、捕获异常就行了。 ###### 引用来自“ssn6”的答案 引用来自“中山野鬼”的答案 你这个是window下的?如果是我早忘光了。哈。基本上几年前,我就把“线程”这个概念扔掉了。用进程的构造方式,我们可以讨论讨论中间的逻辑问题。问我线程的任何问题,可权当我不会,因为线程的事情,进程都可以做。所谓线程省资源,更高效,那是基于没有考虑线程额外带来的逻辑的空谈。 不懂就说你不懂又不会死,别在这里误导新手。线程当然比进程轻量,线程能做的事当然很多进程都做不了,而且楼主发的代码是关于互斥体的与多线程没多大关系,互斥体是跨进程的,你即然这么熟悉多进程,看到一个互斥体的代码却扯了一堆不相关的东西? 而且异常退出关线程、进程啥事?调试方法的问题,你告诉楼主调试中断、捕获异常就行了。 哈,随便你说懂不懂,“线程比进程轻,”,我倒想问问,这个“轻”是怎么定义的?系统自定义的(当然不是说你本人),还是针对应用效果定义的?或是开发复杂度定义的? “楼主发的代码是关于互斥体的与多线程没多大关系,互斥体是跨进程的,”为了忙个同步问题,扯出“线程”,结果又扯出“进程”你觉得这样的设计思维没有问题,我就没有办法咯。 哈。工程设计,谁对谁错,需要实际做出来给客户检验,当然也包括不停的维护和改良这个系统的程序员来评判。落到我的个人看法上,会让思维和逻辑变的更复杂的系统,我是不参合讨论的。你说我不懂,那我就不懂吧,而且我真心的说我不懂。因为我根本没必要去懂那些把逻辑搞的更杂而会形成更加混乱局面的东西。包括思维方法,和设计工具以及一堆堆没有价值的概念名词,(有么有价值不是我说的哦。是系统的可延展设计和用户感受说的)哈。 ###### 引用来自“中山野鬼”的答案 引用来自“ssn6”的答案 引用来自“中山野鬼”的答案 你这个是window下的?如果是我早忘光了。哈。基本上几年前,我就把“线程”这个概念扔掉了。用进程的构造方式,我们可以讨论讨论中间的逻辑问题。问我线程的任何问题,可权当我不会,因为线程的事情,进程都可以做。所谓线程省资源,更高效,那是基于没有考虑线程额外带来的逻辑的空谈。 不懂就说你不懂又不会死,别在这里误导新手。线程当然比进程轻量,线程能做的事当然很多进程都做不了,而且楼主发的代码是关于互斥体的与多线程没多大关系,互斥体是跨进程的,你即然这么熟悉多进程,看到一个互斥体的代码却扯了一堆不相关的东西? 而且异常退出关线程、进程啥事?调试方法的问题,你告诉楼主调试中断、捕获异常就行了。 哈,随便你说懂不懂,“线程比进程轻,”,我倒想问问,这个“轻”是怎么定义的?系统自定义的(当然不是说你本人),还是针对应用效果定义的?或是开发复杂度定义的? “楼主发的代码是关于互斥体的与多线程没多大关系,互斥体是跨进程的,”为了忙个同步问题,扯出“线程”,结果又扯出“进程”你觉得这样的设计思维没有问题,我就没有办法咯。 哈。工程设计,谁对谁错,需要实际做出来给客户检验,当然也包括不停的维护和改良这个系统的程序员来评判。落到我的个人看法上,会让思维和逻辑变的更复杂的系统,我是不参合讨论的。你说我不懂,那我就不懂吧,而且我真心的说我不懂。因为我根本没必要去懂那些把逻辑搞的更杂而会形成更加混乱局面的东西。包括思维方法,和设计工具以及一堆堆没有价值的概念名词,(有么有价值不是我说的哦。是系统的可延展设计和用户感受说的)哈。 你不是忘光了,你是根本没用过多线程,更不知道多线程是什么东西,你不是不懂你是不懂到令人震惊的地步,可是你又喜欢喷,线程为什么比线程轻量要问我干什么,不懂自已去学习,什么是线程能做的进程不能做的自己去搞清楚,互斥体是跨进程的不是说楼主的代码里扯到了跨进程,他也可以当线程互斥体来用,你说你根本就一个外行,你还死要面子,动不动就写万言书装逼你累不? ######楼主的意思应该是在主线程里面开一个新的线程去完成一个任务,但是任务还没有完成主线程就退出了。如果这这样的话,上面的代码可以完成楼主的需求,可是感觉你这样做没有什么意义啊。######就是在主进程中,每次过来一个连接就创建一个线程执行A函数,第一个线程的A函数执行没问题,第二个线程执行的时候程序就退出了,这个咋看啥原因。###### 引用来自“ssn6”的答案 引用来自“中山野鬼”的答案 引用来自“ssn6”的答案 引用来自“中山野鬼”的答案 你这个是window下的?如果是我早忘光了。哈。基本上几年前,我就把“线程”这个概念扔掉了。用进程的构造方式,我们可以讨论讨论中间的逻辑问题。问我线程的任何问题,可权当我不会,因为线程的事情,进程都可以做。所谓线程省资源,更高效,那是基于没有考虑线程额外带来的逻辑的空谈。 不懂就说你不懂又不会死,别在这里误导新手。线程当然比进程轻量,线程能做的事当然很多进程都做不了,而且楼主发的代码是关于互斥体的与多线程没多大关系,互斥体是跨进程的,你即然这么熟悉多进程,看到一个互斥体的代码却扯了一堆不相关的东西? 而且异常退出关线程、进程啥事?调试方法的问题,你告诉楼主调试中断、捕获异常就行了。 哈,随便你说懂不懂,“线程比进程轻,”,我倒想问问,这个“轻”是怎么定义的?系统自定义的(当然不是说你本人),还是针对应用效果定义的?或是开发复杂度定义的? “楼主发的代码是关于互斥体的与多线程没多大关系,互斥体是跨进程的,”为了忙个同步问题,扯出“线程”,结果又扯出“进程”你觉得这样的设计思维没有问题,我就没有办法咯。 哈。工程设计,谁对谁错,需要实际做出来给客户检验,当然也包括不停的维护和改良这个系统的程序员来评判。落到我的个人看法上,会让思维和逻辑变的更复杂的系统,我是不参合讨论的。你说我不懂,那我就不懂吧,而且我真心的说我不懂。因为我根本没必要去懂那些把逻辑搞的更杂而会形成更加混乱局面的东西。包括思维方法,和设计工具以及一堆堆没有价值的概念名词,(有么有价值不是我说的哦。是系统的可延展设计和用户感受说的)哈。 你不是忘光了,你是根本没用过多线程,更不知道多线程是什么东西,你不是不懂你是不懂到令人震惊的地步,可是你又喜欢喷,线程为什么比线程轻量要问我干什么,不懂自已去学习,什么是线程能做的进程不能做的自己去搞清楚,互斥体是跨进程的不是说楼主的代码里扯到了跨进程,他也可以当线程互斥体来用,你说你根本就一个外行,你还死要面子,动不动就写万言书装逼你累不? 哈。window的线程,10年前就写过。arm的里面的解码算法程序本身也包括三个线程,用于解决arm和dsp处理速度不匹配的问题。你说我不懂线程,我可以去“承认”,你说我没做过线程设计,哈,这个就不行了。我经历的事实是摆在那的,不是你所能否定的。 另外说一句,你仅能肯定而不能否定一个事物,只能证明你并没有完全了解这个事物。等你啥时懂我在说什么了,在和我讨论“线程”的优势吧。 与其我参与楼主的问题,倒不如给楼主额外的建议和思考问题的方法,也即,是否真的要去学习“线程”的设计方法。我建议你,要么直接回复楼主的答案,要么也就设计方法的好坏给楼主建议,与我争懂不懂,哈,很无聊,不和你争,你说什么都是“对的”。 ###### 引用来自“狼来了而已”的答案 楼主的意思应该是在主线程里面开一个新的线程去完成一个任务,但是任务还没有完成主线程就退出了。如果这这样的话,上面的代码可以完成楼主的需求,可是感觉你这样做没有什么意义啊。 加些日志看看,是不是在执行过程中有什么原因或者异常导致程序退出了。

爱吃鱼的程序员 2020-06-05 13:15:23 0 浏览量 回答数 0

问题

【精品问答】Java经典问答之SpringBoot 100问

问问小秘 2019-12-01 22:00:40 1176 浏览量 回答数 0

回答

回 1楼无衣蒹葭的帖子 是这样的,我是一个服务器要一直获取用户传来的资源进行处理再回送 但是如果我在中途进行aos_http_io_deinitialize(); 程序就相当于返回到更高一级的线程,在那个线程里通过批处理去掉cmd如果异常 批处理会终止 不进行aos_http_io_deinitialize();的话 会在当前子线程模块运行 能确保程序的正确运行 ------------------------- 回 1楼无衣蒹葭的帖子 我没有采取外调 exe方式 而是直接把sdk代码加到我原有的代码里了 ------------------------- 回 1楼无衣蒹葭的帖子 只调用aos_pool_destroy(p);不调用aos_http_io_deinitialize();会有什么问题? 或者有没有其他的办法 不让程序回到更高一级? ------------------------- 回 5楼无衣蒹葭的帖子 嗯,确实是多线程,那样的话如果在主函数循环里进行清理会影响到其他线程的处理对吧? ------------------------- 回 5楼无衣蒹葭的帖子 是不是只要运行一次aos_http_io_deinitialize last就可以全部清理 我在主循环里设置一个空闲的期间 然后进行 aos_http_io_initialize("oss_test", 0); aos_http_io_deinitialize(); 两句 这样行嘛? ------------------------- 回 5楼无衣蒹葭的帖子 我试了一下,发现只要我加了aos_http_io_deinitialize(); 程序就错了= =!!! 后面调系统命令只要异常就不会继续执行了 不知道这是什么情况。。。 ------------------------- 回 9楼无衣蒹葭的帖子 这个问题蛮蛋疼的。。只要我用aos_http_io_initialize cmd就会回到主线程状态 出异常就直接错了 哪怕只是删一个不存在的文件夹。。都不会继续执行批处理了 ------------------------- 回 9楼无衣蒹葭的帖子 只调aos_pool_destroy(p) 不调aos_http_io_initialize 然后 定期重启整个程序 会不会有什么危害? 从目前的状态来看 我确实不能调aos_http_io_initialize。。。除非我把整个osssdk单独做一个进程去调用 ------------------------- ReCSDKOSS不清理运行环境会怎样? 确实每次上传下载内存都有少量的增长

九日王朝 2019-12-02 01:28:29 0 浏览量 回答数 0

问题

【精品问答】Java微服务架构之Spring Boot核心知识 100问(附源码)

游客pklijor6gytpx 2019-12-01 22:04:21 850 浏览量 回答数 0

回答

Kotlin的简介 Kotlin是由JetBrains公司(IDEA开发者)所开发的编程语言,其名称来自于开发团队附近的科特林岛。 多平台开发 JVM :Android; Server-Side Javascript:前端 Native(beta) :开发原生应用 windows、macos、linux Swift与Kotlin非常像 http://nilhcem.com/swift-is-like-kotlin/ kotlin发展历程 image.png java发展历程 image.png JVM语言的原理 image.png JVM规范与java规范是相互独立的 只要生成的编译文件匹配JVM字节码规范,任何语言都可以由JVM编译运行. Kotlin也是一种JVM语言,完全兼容java,可以与java相互调用;Kotlin语言的设计受到Java、C#、JavaScript、Scala、Groovy等语言的启发 kotlin的特性 下面不会罗列kotlin中具体的语法,会介绍我认为比较重要的特性,以及特性背后的东西。 类型推断 空类型设计 函数式编程 类型推断 image.png 类型推断是指编程语言中在编译期自动推导出值的数据类型。推断类型的能力让很多编程任务变得容易,让程序员可以忽略类型标注的同时仍然允许类型检查。 在开发环境中,我们往往写出表达式,然后可以用快捷键来生成变量声明,往往都是很准的,这说明了编译器其实是可以很准确的推断出来类型的。编程语言所具备的类型推断能力可以把类型声明的任务由开发者转到了编译器. java中声明变量的方式是类型写在最前面,后面跟着变量名,这就迫使开发者在声明变量时就要先思考变量的类型要定义成什么,而在一些情况下比如使用集合、泛型类型的变量,定义类型就会变得比较繁琐。 Kotlin中声明变量,类型可以省略,或者放到变量名后面,这可以降低类型的权重,从必选变为可选,降低开发者思维负担。java10中也引入了类型推断。 Javascript中声明变量也是用关键字var,但是还是有本质区别的,Kotlin中的类型推断并不是变成动态类型、弱类型,类型仍然是在编译期就已经决定了的,Kotlin仍然是静态类型、强类型的编程语言。javascript由于是弱类型语言,同一个变量可以不经过强制类型转换就被赋不同数据类型的值, 编程语言的一个趋势就是抽象程度越来越高,编译器做更多的事情。 空类型设计 空类型的由来 image.png 托尼·霍尔(Tony Hoare),图灵奖得主 托尼·霍尔是ALGOL语言的设计者,该语言在编程语言发展历史上非常重要,对其他编程语言产生重大影响,大多数近代编程语言(包括C语言)皆使用类似ALGOL的语法。他在一次大会上讨论了null应用的设计: “我把 null 引用称为自己的十亿美元错误。它的发明是在1965 年,那时我用一个面向对象语言( ALGOL W )设计了第一个全面的引用类型系统。我加入了null引用设计,仅仅是因为实现起来非常容易。它导致了数不清的错误、漏洞和系统崩溃,可能在之后 40 年中造成了十亿美元的损失。” null引用存在的问题 以java为例,看null引用的设计到底存在哪些问题 空指针问题NPE 编译时不能对空指针做出检查,运行时访问null对象就会出现错误,这个就是工程中常见的空指针异常。 null本身没有语义,会存在歧义 值未被初始化 值不存在 也许表示一种状态 逻辑上有漏洞 Java中,null可以赋值给任何引用,比如赋值给String类型变量,String a = null,但是null并不是String类型: a instanceof String 返回的是false,这个其实是有些矛盾的。所以当持有一个String类型的变量,就存在两种情况,null或者真正的String. 解决NPE的方式 防御式代码 在访问对象前判空,但会有冗余代码;会规避问题,而隐藏真正的问题 抛出异常给调用方处理 方法中传参传入的空值、无效值,抛出受检查异常给上层调用方 增加注解 Android中可以增加@NonNull注解,编译时做额外检查 空状态对象设计模式 空状态对象是一个实现接口但是不做任何业务逻辑的对象,可以取代判空检查;这样的空状态对象也可以在数据不可用的时候提供默认的行为 java8 Optional类 java8中引入了Optional类,来解决广泛存在的null引用问题.官方javadoc文档介绍 A container object which may or may not contain a non-null value. If a value is present, isPresent() will return true and get() will return the value. Additional methods that depend on the presence or absence of a contained value are provided, such as orElse() (return a default value if value not present) and ifPresent() (execute a block of code if the value is present). 来看一下是如何实现的。 举一个访问对象读取熟悉的例子 java 8 之前 : image.png java 8: image.png 总结: 1.用Optional还是会比较繁琐,这个也说明了设计一个替代null的方案还是比较难的。 optional的耗时大约是普通判空的数十倍,主要是涉及泛型、使用时多创键了一个对象的创建;数据比较大时,会造成性能损失。 java8 引入Optional的意义在于提示调用者,用特殊类型包装的变量可能为空,在使用取出时需要判断 Kotlin的空类型设计 Kotlin中引入了可空类型和不可空类型的区分,可以区分一个引用可以容纳null,还是不能容纳null。 String vs String? String 类型表示变量不能为空,String?则表示变量可以为空 String?含义是String or null.这两种是不同的类型. 比如: var a:String = “abc” //ok var a:String = null //不允许 var b :String? = null //ok a=b // 不允许 String?类型的值不能给String类型的值赋值 这样就将类型分成了可空类型和不可能类型,每一个类型都有这样的处理;Kotlin中访问非空类型变量永远不会出现空指针异常。 同样上面的例子,采用Kotlin去写,就会简洁很多 image.png 编程范式-函数式编程 编程范式是什么? 编程范式是程序员看待程序和写程序的观点 主要的类型 非结构化编程 结构化编程 面向对象编程 命令式编程 函数式编程 这些类型并不是彼此互斥的,而是按照不同的维度做的划分,一种编程语言可能都支持多个编程范式 非结构化编程 第一代的高级语言往往是非结构化编程 比如 BASIC语言 每一行的代码前面都有一个数字作为行号,通常使用GOTO的跳跃指令来实现判断和循环. 看一下下面这段代码是做什么的: image.png 实际上做的是:程序在屏幕上显示数字 1 到 10 及其对应的平方 采用这种方式写程序,大量的使用goto实现逻辑的跳转,代码一长,可读性和维护性就比较差了,形成“面条式代码” 结构化编程 采用顺序、分支、循环结构来表达,禁用或者少用GOTO; 并用子程序来组织代码,采用自顶向下的方式来写程序 代表语言是C语言 实现同样的逻辑: image.png 可见采用结构化编程,代码的逻辑会更清晰。 面向对象编程 思想: 将计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。 特性: 封装性、继承性、多态性。 命令式编程 把计算机程序视为一系列的命令集合 主要思想是关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。 “先做这,再做那”,强调“怎么做” 实现: 用变量来储存数据,用语句来执行指令,改变变量状态。 基本所有的常见的编程语言都具有此范式 函数式编程 声明式语法,描述要什么,而不是怎么做 类似于SQL语句 语言: kotlin swift python javascript scala 函数是第一等公民 可以赋值给变量,可作为参数传入另一个函数,也可作为函数的返回值 纯函数 y=f(x) 只要输入相同,返回值不变 没有副作用:不修改函数的外部状态 举个栗子 公司部门要进行outing,去哪里是个问题,要考虑多个因素,比如花费、距离、天数等等,有多个备选地点进行选择。 定义一个数据类: image.png 要进行筛选了,分别用sql,kotlin,java来实现 找出花费低于2000元的outing地点信息 SQL image.png Kotlin image.png java 7 image.png 可见kotin的写法还是比较接近于sql的思想的,声明式的写法,而不管具体如何实现;其中的:place->place.money<2000 就是函数,可以作为参数传递给fliter这个高阶函数;而且这个函数没有副作用,不改变外部状态。 再来一个复杂一点的: 找出花费低于5000元,时间不多于4天,按照距离排序的outing地点名称 SQL image.png Kotlin: image.png java 7 image.png 由此可见用kotlin的函数式写法,会更简洁,逻辑也更清晰,这段代码的目标一目了然,这种清晰在于实现了业务逻辑与控制逻辑的分离,业务逻辑就是由函数实现的,比如place->place.money<500,而控制逻辑是由filter,sorterBy等高阶函数实现的。 而java的传统写法是基于对数据的操作,避免不了遍历的操作,业务逻辑与控制逻辑交织在了一起,这段代码的目的就不是那么容易清晰看到的了。 总结 kotlin是实用的现代编程语言,吸收了众多编程语言的优点,支持类型推断、空类型安全、函数式编程、DSL等特性,非常值得学习和使用。

问问小秘 2020-04-30 16:33:40 0 浏览量 回答数 0

回答

1、基于使用者清楚批量操作的数据量限制的前提下,其实使用者手动分好批次执行batch和指定batchsize参数执行木有太大区别。唯一一点就是如果指定参数程序自动分批次的话,在发生异常的时候可能需要在报告异常的时候,指明是第几个批次失败了,否则就要去check数据才能知道。 2、如果使用者不知道批量操作的数据量限制的话,batchsize参数可能会给使用者带来疑惑。 综上,带有batchsize参数有两点好处:1、省代码,不用自己写循环和其他重复代码。2、强制使用者清楚数据量是批量操作成功与否的因素之一。 当然凡事都是双刃剑,缺点可能就如楼主和上述所述。 建议,是否可以考虑加一批不带batchsize参数的重载,即默认batchsize为Integer.MAX_VALUE?其次,自动分批次如果异常能否提示批次号? ######我支持你的建议,哈哈######使用 Integer.MAX_VALUE是个好主意,下一版考虑做此改变######     这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。     目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 50000。 ###### 引用来自“JFinal”的答案     这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。     目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 5000。 额,怎么说呢。我主要做数据库间的数据交换的 及 磁盘文件数据分析入库的, 感觉对于非web 程序,用Jfinal 的 Db 还不能满足我的要求啊。 ###### 引用来自“Mr.Over”的答案 引用来自“JFinal”的答案     这的确是个头疼的问题。如果我没有记错的话oracle 10G addBatch最多只能是五万多条,所以如果数据量足够大,想让所有数据全部在一个事务中处理也是办不到的。     目前JFinal的设计主要是考虑了批量操作的性能,即便如此,开发者可根据数据库类型设置合理的batchSize,例如oracle 10G可以设置为 5000。 额,怎么说呢。我主要做数据库间的数据交换的 及 磁盘文件数据分析入库的, 感觉对于非web 程序,用Jfinal 的 Db 还不能满足我的要求啊。 哪天把你的需求详细发起个问答,我看看有什么更好的方案 :) ######每次做个提交。。。并记录回滚的

爱吃鱼的程序员 2020-06-04 16:38:48 0 浏览量 回答数 0

回答

使用断言的最佳时机偶尔会被提起,通常是因为有人误用,因此我觉得有必要写一篇文章来阐述一下什么时候应该用断言,为什么应该用,什么时候不该用。 对那些没有意识到用断言的最佳时机的人来说,Python的断言就是检测一个条件,如果条件为真,它什么都不做;反之它触发一个带可选错误信息的AssertionError。如下例所示: 很多人将断言作为当传递了错误的参数值时的一种快速而简便的触发异常的方式。但实际上这是错误的,而且是非常危险的错误,原因有两点。首先,AssertionError通常是在测试函数参数时给出的错误。你不会像下面这样编码: 你应该用TypeError来替代,“断言”解决了错误的异常类型。 但是对断言来说更危险也更纠结的是:如果你执行Python时使用了-O或-OO优化标识,这能够通过编译却从来不会被执行,实际上就是说并不能保证断言会被执行。当恰当地使用了断言,这非常好的,但当不恰当地使用了断言,在使用-O标识执行时它将导致代码被彻底中断。 那么我们什么时候应该使用断言呢?如果没有特别的目的,断言应该用于如下情况: 防御性的编程运行时对程序逻辑的检测合约性检查(比如前置条件,后置条件)程序中的常量检查文档(断言也可以用于代码测试,用作一个做事毛手毛脚的开发人员的单元测试,只要能你接受当使用-O标志时这个测试什么都不做。我有时也会在代码中用"assert Fasle"来对还没有实现的分支作标记,当然我希望他们失败。如果稍微更细节一些,或许触发NotImplementedError是更好的选择) 因为程序员是对于代码正确性表现出的信心不同,因此对于什么时候使用断言的意见各不相同。如果你确信代码是正确的,那么断言没有任何意义,因为它们从不会失败,因此你可以放心地移除它们。如果你确信它们会失败(例如对用户输入的数据的检测),你不敢用断言,这样编译就能通过,但你跳过了你的检查。 在以上两种情况之间的情况就显得特别有趣了,那就是当你相信代码是正确的,但又不是特别确定的时候。或许你忘记了一些奇怪的边角情况(因为我们都是人),在这种情况下,额外的运行时检查将帮助你尽可能早地捕获错误,而不是写了一大堆代码之后。 (这就是为什么使用断言的时机会不同。因为我们对代码正确性的信息不同,对于一个人有用的断言,对于另一个人来说却是无用的运行时测试。) 另一个断言用得好的地方就是检查程序中的不变量。一个不变量是一些你能相信为真的条件,除非一个缺陷导致它变成假。如果有一个缺陷,越早发现越好,因此我们需要对其进行测试,但我们不想因为这些测试而影响代码执行速度。因此采用断言,它能在开发时生效而在产品中失效。 一个关于不变量的例子可能是这样的情况。如果你的函数在开始的时候期望一个打开的数据库连接,并且在函数返回后该数据库连接依然是打开的,这是一个函数的不变量: 断言也是一个很好的检查点注释。为了替代如下注释: 当我们执行到这里,我们知道n>2 你可以确保在运行时用以下断言: 断言也是一种防御性的编程形式。你不是在防范当前代码发生错误,而防范由于以后的代码变更发生错误。理想情况下,单元测试应该直到这个作用,但是让我们面对这样一个现实:即使存在单元测试,他们在通常情况下也不是很完备。内建的机器人可能没有工作,但数周以来也没有人注意到它,或者人们在提交代码之前忘记了执行测试。内部检查将是防止错误渗入的另一道防线,尤其对于那些悄悄地失败,但会引起代码功能错误并返回错误结果的情况有效。 假设你有一系列的if...elif代码块,你预先知道变量期望的值: 假设这段代码现在完全正确。但它会一直正确吗?需求变更,代码变更。如果需求变为允许target = w,并关联到run_w_code,那将会发生什么情况?如果我们变更了设置target的代码,但是忘记了改变这个代码块,它就会错误地调用run_z_code(),错误就会发生。对于这段代码最好的方法就是编写一些防御性的检查,这样它的执行,即使在变更以后,要么正确,要么马上失败。 在代码开始添加注释是个好的开端,但是人们都不太喜欢读和更新这些注释,这些注释会很快变得过时。但对于断言,我们可以同时对这块代码编写文档,如果这些断言被违反了,会直接引起一个简单而又直接的失败。 这里的断言同时用于防御性编程和检查文档。我认为这是最优的解决方案: 这诱使开发者去不理代码,移除像value ==c这类不必要的测试,以及RuntimeError的“死代码”。另外,当"unexpected error"错误发生时这个消息将非常窘迫,确实会发生。 合约式设计是断言另一个用得好的地方。在合约式设计中,我们认为函数与其他调用者遵循合约,例如像这样的情况: “如果你传给我一个非空字符串,我保证返回转换成大写的首字母。” 如果合约被破坏了,不管是被函数本身还是调用者,这都会产生缺陷。我们说这个函数需要有前置条件(对期望的参数的限制)和后置条件(对返回结果的约束)。因此这个函数可能是这样的: 合约式设计的目的是,在一个正确的程序里,所有的前置条件和后置条件都将得到处理。这是断言的经典应用,自(这个想法持续)我们发布无缺陷的程序并且将其放入产品,程序将是正确的并且我们可以放心地移除检查。

xuning715 2019-12-02 01:10:08 0 浏览量 回答数 0

回答

声明引用变量(即对象)时,实际上是在创建指向对象的指针。考虑以下代码,您在其中声明基本类型的变量int: int x; x = 10; 在此示例中,变量x是an int,Java会0为您初始化它。在10第二行为其分配值时,您的值将10写入所指的存储位置x。 但是,当您尝试声明引用类型时,会发生一些不同的事情。采取以下代码: Integer num; num = new Integer(10); 第一行声明了一个名为的变量num,但实际上尚未包含原始值。相反,它包含一个指针(因为类型是Integer引用类型)。由于您尚未说出要指向的内容,因此Java将其设置为null,表示“ 我什么都没有指向 ”。 在第二行中,new关键字用于实例化(或创建)一个类型的对象,Integer并将指针变量num分配给该Integer对象。 在NullPointerException当你声明一个变量,但没有创建对象时发生。因此,您指向的是实际上不存在的东西。 如果num在创建对象之前尝试取消引用,则会显示NullPointerException。在大多数情况下,编译器会发现问题,并让您知道“” num may not have been initialized,但是有时您可能会编写不直接创建对象的代码。 例如,您可能具有如下方法: public void doSomething(SomeObject obj) { //do something to obj } 在这种情况下,您不是在创建对象obj,而是假设它是在doSomething()调用方法之前创建的。注意,可以这样调用方法: doSomething(null); 在这种情况下obj为null。如果该方法旨在对传入的对象做某事,则最好抛出,NullPointerException因为这是程序员错误,程序员将需要该信息来进行调试。 替代地,在某些情况下,该方法的目的不仅是要对传入的对象进行操作,因此null参数是可以接受的。在这种情况下,您将需要检查null参数并改变行为。您还应该在文档中对此进行解释。例如,doSomething()可以写成: /** * @param obj An optional foo for ____. May be null, in which case * the result will be ____. */ public void doSomething(SomeObject obj) { if(obj != null) { //do something } else { //do something else } } 最后,如何使用堆栈跟踪来查明异常和原因 可以使用哪些方法/工具确定原因,以阻止异常导致程序过早终止? 带有findbug的声纳可以检测NPE。 声纳能否动态捕获由JVM引起的空指针异常

垚tutu 2019-12-02 03:23:42 0 浏览量 回答数 0

问题

健康检查常见问题

行者武松 2019-12-01 21:43:15 3573 浏览量 回答数 0

回答

楼主您好, 欢迎来到阿里云论坛。 现在仅是无法更新文章,还是在站点后台,所有的资料都不能更新呢,如无法提交站点标题的修改? ------------------------- 回 9楼(美美2) 的帖子 您好, 访问站点 http://www.38109222.com/ ,做得还不错喔。 或许可以尝试一下,用别的浏览器来对比一下,看是否有相同的结果,或有没有其它详细的出错信息。 您是用IE来编辑模版的吗?是IE几版本? ------------------------- 回 11楼(美美2) 的帖子 您好, 如果其它浏览器都是类似的结果,那可能需要重点检查一下程序相关的设置啦。 如程序的后台管理页面,有没有提供缺少什么组件或文件夹权限异常的? ------------------------- 楼主您好,好象 cmseasy 程序的官方网站里说,为了安全,不允许在线编辑模版文件哩。请参考:http://chm.cmseasy.cn/bianjimobantishibaocunshibai_1.html

dongshan8 2019-12-02 03:12:22 0 浏览量 回答数 0

回答

1.第一个问题通过数据版本,也就是所谓的乐观锁解决。 2.先写日志log,然后ack机制。其实很多这种方式被很多应用所用到比如mysql。 3.用户注册本身这个功能不属于高频调用,所以性能上不需要考虑太多,直接悲观锁实现即可。而且这种可能性非常低,就算失败,那么返回给用户一个能理解的失败信息即可。######回复 @sixliu:谢谢回复靠谱的回答真不多我再等等看...######回复 @花歌:第二个可能没太理解你的场景######谢谢咯~1和3可以,我看看还有什么别的方案,差不多也就这么做了,2的话再考虑考虑吧感觉还是有点不适用场景###### 三个问题,其实就是同一个并发的问题,###### 都是并发中会出现的问题。 1说的在内存里的情况,就是2。 1说的在数据库中的情况,就是3。 在数据库中,数据库自己会有锁来解决这个问题,遇到这种情况会修改失败,程序中捕获这种异常做处理返回给前台就可以了。 在内存中,单机单进程单线程,会有顺序,因此没有问题。多机或多进程或多线程操作同一数据,会出现此问题。一种实现方式是加锁,相当于仿照数据库那样的实现,内存正在被修改时,其他的修改会被阻塞或者异常终止。另一种方式是通过队列实现顺序操作,所有的修改都发送到一个程序修改。######让我想想,嗯差不多,回答比较靠谱,谢了先其实...我用的是nodejs全异步操作,前面的数据库操作没完成,后面的也可以进入函数,如果网络延迟,就会造成执行完成顺序和开始执行顺序不一致...等等想一会再问你哈###### 1.是设计上的问题 两个操作如果有先后顺序 就得先后执行  一个操作完了之后再下一个操作 不可能明知道有一前一后却还要非得一起 2.这个就是非常典型的数据库事务 就是保证多个不相关的操作的原子性 只要其中一个出问题就全部回滚 不存在有的成功有的失败 事务还是个挺复杂的东西 mongodb都还不支持事务 多服务器之间分布式的事务也是有些麻烦的  3.同时的操作数据库自己会进行锁的处理 对数据库来说还是一前一后  如果某个字段设置了唯一索引 那后面的那个必然会出错 代码里正常处理就可以了 所以用户名不唯一的处理有两个地方 一个是在插入之前 一个是在插入时抛出唯一索引异常   当然也可以在新建用户这一整个操作上加锁 全局同时只能有一个用户在新建 不过这样可能效率不高 ######问题1现实情况就是这样用户以为他的操作有顺序但基于连接池算是并发操作即时不用池那也是异步操作不能保证顺序所以只能考虑数据库锁时间戳问题2还没到数据库呢...只考虑多个内存中的对象操作问题3现在就是这样处理的###### 1.加锁 2.加事务控制 3.异常捕获与处理 工作不满一年吧######不好意思...工作6年多了开发经验10多年问题1暂时用乐观锁解决了问题2事务控制个毛线问题你可能是没读清内存中的几个对象而已和数据库无关就是事务也得自己实现这话谁都会说我想听的是备忘录模式这种...到底怎么做能优雅点还是我从需求设计上可能有问题问题3靠数据库唯一约束出错返回太暴力现在就是这么做的也可以数据库加锁怕影响性能###### 1,updateusersetstatus=2wherestatus=3andid=1; 2,用户名设置唯一索引。###### 可以用现在拷贝上操作,再合并的方法解决。1、按顺序合并。2、按状态合并。3、按索引合并。

优选2 2020-06-09 10:36:32 0 浏览量 回答数 0

回答

1.第一个问题通过数据版本,也就是所谓的乐观锁解决。 2.先写日志log,然后ack机制。其实很多这种方式被很多应用所用到比如mysql。 3.用户注册本身这个功能不属于高频调用,所以性能上不需要考虑太多,直接悲观锁实现即可。而且这种可能性非常低,就算失败,那么返回给用户一个能理解的失败信息即可。######回复 @sixliu : 谢谢回复 靠谱的回答真不多 我再等等看...######回复 @花歌 : 第二个 可能没太理解你的场景######谢谢咯~ 1和3可以,我看看还有什么别的方案,差不多也就这么做了,2的话 再考虑考虑吧 感觉还是有点不适用场景###### 三个问题,其实就是同一个并发的问题,###### 都是并发中会出现的问题。 1说的在内存里的情况,就是2。 1说的在数据库中的情况,就是3。 在数据库中,数据库自己会有锁来解决这个问题,遇到这种情况会修改失败,程序中捕获这种异常做处理返回给前台就可以了。 在内存中,单机单进程单线程,会有顺序,因此没有问题。多机或多进程或多线程操作同一数据,会出现此问题。一种实现方式是加锁,相当于仿照数据库那样的实现,内存正在被修改时,其他的修改会被阻塞或者异常终止。另一种方式是通过队列实现顺序操作,所有的修改都发送到一个程序修改。######让我想想,嗯 差不多,回答比较靠谱,谢了先 其实...我用的是nodejs 全异步操作,前面的数据库操作没完成,后面的也可以进入函数,如果网络延迟,就会造成执行完成顺序和开始执行顺序不一致... 等等想一会再问你哈###### 1. 是设计上的问题  两个操作如果有先后顺序  就得先后执行   一个操作完了之后再下一个操作   不可能明知道有一前一后 却还要非得一起 2. 这个就是非常典型的数据库事务   就是保证多个不相关的操作的原子性  只要其中一个出问题就全部回滚  不存在有的成功有的失败  事务还是个挺复杂的东西   mongodb都还不支持事务  多服务器之间分布式的事务也是有些麻烦的   3. 同时的操作 数据库自己会进行锁的处理  对数据库来说还是一前一后    如果某个字段设置了唯一索引  那后面的那个必然会出错  代码里正常处理就可以了   所以用户名不唯一的处理有两个地方  一个是在插入之前  一个是在插入时抛出唯一索引异常      当然也可以在新建用户这一整个操作上加锁   全局同时只能有一个用户在新建  不过这样可能效率不高  ######问题1 现实情况就是这样 用户以为他的操作有顺序 但基于连接池 算是并发操作 即时不用池 那也是异步操作 不能保证顺序 所以只能考虑数据库锁 时间戳 问题2 还没到数据库呢... 只考虑多个内存中的对象操作 问题3 现在就是这样处理的###### 1.加锁 2.加事务控制 3.异常捕获与处理 工作不满一年吧######不好意思... 工作6年多了 开发经验10多年 问题1 暂时用乐观锁解决了 问题2 事务控制个毛线 问题你可能是没读清 内存中的几个对象而已 和数据库无关 就是事务也得自己实现 这话谁都会说 我想听的是 备忘录模式 这种... 到底怎么做能优雅点 还是我从需求设计上可能有问题 问题3 靠数据库唯一约束出错返回太暴力 现在就是这么做的 也可以数据库加锁 怕影响性能###### 1,update user set status=2 where status=3 and id=1; 2,用户名设置唯一索引。###### 可以用现在拷贝上操作,再合并的方法解决。1、按顺序合并。2、按状态合并。3、按索引合并。

爱吃鱼的程序员 2020-05-29 20:15:24 0 浏览量 回答数 0

回答

从业余程序员到职业程序员 程序员刚入行时,我觉得最重要的是把自己培养成职业的程序员。 我的程序员起步比同龄人都晚了很多,更不用说现在的年轻人了。我大学读的是生物专业,在上大学前基本算是完全没接触过计算机。军训的时候因为很无聊,我和室友每天跑去学校的机房玩,我现在还印象很深刻,我第一次走进机房的时候,别人问,你是要玩windows,还是dos,我那是完全的一抹黑。后来就只记得在机房一堆人都是在练习盲打,军训完,盲打倒是练的差不多了,对计算机就这么产生了浓厚的兴趣,大一的时候都是玩组装机,捣鼓了一些,对计算机的硬件有了那么一些了解。 到大二后,买了一些书开始学习当时最火的网页三剑客,学会了手写HTML、PS的基本玩法之类的,课余、暑假也能开始给人做做网站什么的(那个时候做网站真的好赚钱),可能那样过了个一年左右,做静态的网页就不好赚钱了,也不好找实习工作,于是就开始学asp,写些简单的CRUD,做做留言板、论坛这些动态程序,应该算是在这个阶段接触编程了。 毕业后加入了深圳的一家做政府行业软件的公司,一个非常靠谱和给我空间的Leader,使得自己在那几年有了不错的成长,终于成了一个职业的程序员。 通常来说,业余或半职业的程序员,多数是1个人,或者很小的一个团队一起开发,使得在开发流程、协作工具(例如jira、cvs/svn/git等)、测试上通常会有很大的欠缺,而职业的程序员在这方面则会专业很多。另外,通常职业的程序员做的系统都要运行较长的时间,所以在可维护性上会特别注意,这点我是在加入阿里后理解更深的。一个运行10年的系统,和一个写来玩玩的系统显然是有非常大差别的。 这块自己感觉也很难讲清楚,只能说模模糊糊有个这样的概念。通常在有兴趣的基础上,从业余程序员跨越到成为职业程序员我觉得不会太难。 编程能力的成长 作为程序员,最重要的能力始终是编程能力,就我自己的感受而言,我觉得编程能力的成长主要有这么几个部分: 1、编程能力初级:会用 编程,首先都是从学习编程语言的基本知识学起的,不论是什么编程语言,有很多共同的基本知识,例如怎么写第一个Hello World、if/while/for、变量等,因此我比较建议在刚刚开始学一门编程语言的时候,看看编程语言自己的一些文档就好,不要上来就去看一些高阶的书。我当年学Java的时候上来就看Think in Java、Effective Java之类的,真心好难懂。 除了看文档以外,编程是个超级实践的活,所以一定要多写代码,只有这样才能真正熟练起来。这也是为什么我还是觉得在面试的时候让面试者手写代码是很重要的,这个过程是非常容易判断写代码的熟悉程度的。很多人会说由于写代码都是高度依赖IDE的,导致手写很难,但我绝对相信写代码写了很多的人,手写一段不太复杂的、可运行的代码是不难的。即使像我这种三年多没写过代码的人,让我现在手写一段不太复杂的可运行的Java程序,还是没问题的,前面N年的写代码生涯使得很多东西已经深入骨髓了。 我觉得编程能力初级这个阶段对于大部分程序员来说都不会是问题,勤学苦练,是这个阶段的核心。 2、编程能力中级:会查和避免问题 除了初级要掌握的会熟练的使用编程语言去解决问题外,中级我觉得首先是提升查问题的能力。 在写代码的过程中,出问题是非常正常的,怎么去有效且高效的排查问题,是程序员群体中通常能感受到的大家在编程能力上最大的差距。 解决问题能力强的基本很容易在程序员群体里得到很高的认可。在查问题的能力上,首先要掌握的是一些基本的调试技巧,好用的调试工具,在Java里有JDK自带的jstat、jmap、jinfo,不在JDK里的有mat、gperf、btrace等。工欲善其事必先利其器,在查问题上是非常典型的,有些时候大家在查问题时的能力差距,有可能仅仅是因为别人比你多知道一个工具而已。 除了调试技巧和工具外,查问题的更高境界就是懂原理。一个懂原理的程序员在查问题的水平上和其他程序员是有明显差距的。我想很多的同学应该能感受到,有些时候查出问题的原因仅仅是因为有效的工具,知其然不知其所以然。 我给很多阿里的同学培训过Java排查问题的方法,在这个培训里,我经常也会讲到查问题的能力的培养最主要的也是熟练,多尝试给自己写一些会出问题的程序,多积极的看别人是怎么查问题的,多积极的去参与排查问题,很多最后查问题能力强的人多数仅仅是因为“无他,但手熟尔”。 我自己排查问题能力的提升主要是在2009年和2010年。那两年作为淘宝消防队(处理各种问题和故障的虚拟团队)的成员,处理了很多的故障和问题。当时消防队还有阿里最公认的技术大神——多隆,我向他学习到了很多排查问题的技巧。和他比,我排查问题的能力就是初级的那种。 印象最深刻的是一次我们一起查一个应用cpu us高的问题,我们两定位到是一段代码在某种输入参数的时候会造成cpu us高的原因后,我能想到的继续查的方法是去生产环境抓输入参数,然后再用参数来本地debug看是什么原因。但多隆在看了一会那段代码后,给了我一个输入参数,我拿这个参数一运行,果然cpu us很高!这种case不是一次两次。所以我经常和别人说,我是需要有问题场景才能排查出问题的,但多隆是完全有可能直接看代码就能看出问题的,这是本质的差距。 除了查问题外,更厉害的程序员是在写代码的过程就会很好的去避免问题。大家最容易理解的就是在写代码时处理各种异常情况,这里通常也是造成程序员们之间很大的差距的地方。 写一段正向逻辑的代码,大部分情况下即使有差距,也不会太大,但在怎么很好的处理这个过程中有可能出现的异常上,这个时候的功力差距会非常明显。很多时候一段代码里处理异常逻辑的部分都会超过正常逻辑的代码量。 我经常说,一个优秀程序员和普通程序员的差距,很多时候压根就不需要看什么满天飞的架构图,而只用show一小段的代码就可以。 举一个小case大家感受下。当年有一个严重故障,最后查出的原因是输入的参数里有一个是数组,把这个数组里的值作为参数去查数据库,结果前面输入了一个很大的数组,导致从数据库查了大量的数据,内存溢出了,很多程序员现在看都会明白对入参、出参的保护check,但类似这样的case我真的碰到了很多。 在中级这个阶段,我会推荐大家尽可能的多刻意的去培养下自己这两个方面的能力,成为一个能写出高质量代码、有效排查问题的优秀程序员。 3、编程能力高级:懂高级API和原理 就我自己的经历而言,我是在写了多年的Java代码后,才开始真正更细致的学习和掌握Java的一些更高级的API,我相信多数Java程序员也是如此。 我算是从2003年开始用Java写商业系统的代码,但直到在2007年加入淘宝后,才开始非常认真地学习Java的IO通信、并发这些部分的API。尽管以前也学过也写过一些这样的代码,但完全就是皮毛。当然,这些通常来说有很大部分的原因会是工作的相关性,多数的写业务系统的程序员可能基本就不需要用到这些,所以导致会很难懂这些相对高级一些的API,但这些API对真正的理解一门编程语言,我觉得至关重要。 在之前的程序员成长路线的文章里我也讲到了这个部分,在没有场景的情况下,只能靠自己去创造场景来学习好。我觉得只要有足够的兴趣,这个问题还是不大的,毕竟现在有各种开源,这些是可以非常好的帮助自己创造机会学习的,例如学Java NIO,可以自己基于NIO包一个框架,然后对比Netty,看看哪些写的是不如Netty的,这样会非常有助于真正的理解。 在学习高级API的过程中,以及排查问题的过程中,我自己越来越明白懂编程语言的运行原理是非常重要的,因此我到了后面的阶段开始学习Java的编译机制、内存管理、线程机制等。对于我这种非科班出身的而言,学这些会因为缺乏基础更难很多,但这些更原理性的东西学会了后,对自己的编程能力会有质的提升,包括以后学习其他编程语言的能力,学这些原理最好的方法我觉得是先看看一些讲相关知识的书,然后去翻看源码,这样才能真正的更好的掌握,最后是在以后写代码的过程中、查问题的过程中多结合掌握的原理,才能做到即使在N年后也不会忘。 在编程能力的成长上,我觉得没什么捷径。我非常赞同1万小时理论,在中级、高级阶段,如果有人指点或和优秀的程序员们共事,会好非常多。不过我觉得这个和读书也有点像,到了一定阶段后(例如高中),天分会成为最重要的分水岭,不过就和大部分行业一样,大部分的情况下都还没到拼天分的时候,只需要拼勤奋就好。 系统设计能力的成长 除了少数程序员会进入专深的领域,例如Linux Kernel、JVM,其他多数的程序员除了编程能力的成长外,也会越来越需要在系统设计能力上成长。 通常一个编程能力不错的程序员,在一定阶段后就会开始承担一个模块的工作,进而承担一个子系统、系统、跨多领域的更大系统等。 我自己在工作的第三年开始承担一个流程引擎的设计和实现工作,一个不算小的系统,并且也是当时那个项目里的核心部分。那个阶段我学会了一些系统设计的基本知识,例如需要想清楚整个系统的目标、模块的划分和职责、关键的对象设计等,而不是上来就开始写代码。但那个时候由于我是一个人写整个系统,所以其实对设计的感觉并还没有那么强力的感觉。 在那之后的几年也负责过一些系统,但总体感觉好像在系统设计上的成长没那么多,直到在阿里的经历,在系统设计上才有了越来越多的体会。(点击文末阅读原文,查看:我在系统设计上犯过的14个错,可以看到我走的一堆的弯路)。 在阿里有一次做分享,讲到我在系统设计能力方面的成长,主要是因为三段经历,负责专业领域系统的设计 -> 负责跨专业领域的专业系统的设计 -> 负责阿里电商系统架构级改造的设计。 第一段经历,是我负责HSF。HSF是一个从0开始打造的系统,它主要是作为支撑服务化的框架,是个非常专业领域的系统,放在整个淘宝电商的大系统来看,其实它就是一个很小的子系统,这段经历里让我最深刻的有三点: 1).要设计好这种非常专业领域的系统,专业的知识深度是非常重要的。我在最早设计HSF的几个框的时候,是没有设计好服务消费者/提供者要怎么和现有框架结合的,在设计负载均衡这个部分也反复了几次,这个主要是因为自己当时对这个领域掌握不深的原因造成的; 2). 太技术化。在HSF的阶段,出于情怀,在有一个版本里投入了非常大的精力去引进OSGi以及去做动态化,这个后来事实证明是个非常非常错误的决定,从这个点我才真正明白在设计系统时一定要想清楚目标,而目标很重要的是和公司发展阶段结合; 3). 可持续性。作为一个要在生产环境持续运行很多年的系统而言,怎么样让其在未来更可持续的发展,这个对设计阶段来说至关重要。这里最low的例子是最早设计HSF协议的时候,协议头里竟然没有版本号,导致后来升级都特别复杂;最典型的例子是HSF在早期缺乏了缺乏了服务Tracing这方面的设计,导致后面发现了这个地方非常重要后,全部落地花了长达几年的时间;又例如HSF早期缺乏Filter Chain的设计,导致很多扩展、定制化做起来非常不方便。 第二段经历,是做T4。T4是基于LXC的阿里的容器,它和HSF的不同是,它其实是一个跨多领域的系统,包括了单机上的容器引擎,容器管理系统,容器管理系统对外提供API,其他系统或用户通过这个来管理容器。这个系统发展过程也是各种犯错,犯错的主要原因也是因为领域掌握不深。在做T4的日子里,学会到的最重要的是怎么去设计这种跨多个专业领域的系统,怎么更好的划分模块的职责,设计交互逻辑,这段经历对我自己更为重要的意义是我有了做更大一些系统的架构的信心。 第三段经历,是做阿里电商的异地多活。这对我来说是真正的去做一个巨大系统的架构师,尽管我以前做HSF的时候参与了淘宝电商2.0-3.0的重大技术改造,但参与和自己主导是有很大区别的,这个架构改造涉及到了阿里电商众多不同专业领域的技术团队。在这个阶段,我学会的最主要的: 1). 子系统职责划分。在这种超大的技术方案中,很容易出现某些部分的职责重叠和冲突,这个时候怎么去划分子系统,就非常重要了。作为大架构师,这个时候要从团队的职责、团队的可持续性上去选择团队; 2). 大架构师最主要的职责是控制系统风险。对于这种超大系统,一定是多个专业领域的架构师和大架构师共同设计,怎么确保在执行的过程中对于系统而言最重要的风险能够被控制住,这是我真正的理解什么叫系统设计文档里设计原则的部分。 设计原则我自己觉得就是用来确保各个子系统在设计时都会遵循和考虑的,一定不能是虚的东西,例如在异地多活架构里,最重要的是如何控制数据风险,这个需要在原则里写上,最基本的原则是可接受系统不可用,但也要保障数据一致,而我看过更多的系统设计里设计原则只是写写的,或者千篇一律的,设计原则切实的体现了架构师对目标的理解(例如当时异地多活这个其实开始只是个概念,但做到什么程度才叫做到异地多活,这是需要解读的,也要确保在技术层面的设计上是达到了目标的),技术方案层面上的选择原则,并确保在细节的设计方案里有对于设计原则的承接以及执行; 3). 考虑问题的全面性。像异地多活这种大架构改造,涉及业务层面、各种基础技术层面、基础设施层面,对于执行节奏的决定要综合考虑人力投入、机器成本、基础设施布局诉求、稳定性控制等,这会比只是做一个小的系统的设计复杂非常多。 系统设计能力的成长,我自己觉得最重要的一是先在一两个技术领域做到专业,然后尽量扩大自己的知识广度。例如除了自己的代码部分外,还应该知道具体是怎么部署的,部署到哪去了,部署的环境具体是怎么样的,和整个系统的关系是什么样的。 像我自己,是在加入基础设施团队后才更加明白有些时候软件上做的一个决策,会导致基础设施上巨大的硬件、网络或机房的投入,但其实有可能只需要在软件上做些调整就可以避免,做做研发、做做运维可能是比较好的把知识广度扩大的方法。 第二点是练习自己做tradeoff的能力,这个比较难,做tradeoff这事需要综合各种因素做选择,但这也是所有的架构师最关键的,可以回头反思下自己在做各种系统设计时做出的tradeoff是什么。这个最好是亲身经历,听一些有经验的架构师分享他们选择背后的逻辑也会很有帮助,尤其是如果恰好你也在同样的挑战阶段,光听最终的架构结果其实大多数时候帮助有限。 技术Leader我觉得最好是能在架构师的基础上,后续注重成长的方面还是有挺大差别,就不在这篇里写了,后面再专门来写一篇。 程序员金字塔 我认为程序员的价值关键体现在作品上,被打上作品标签是一种很大的荣幸,作品影响程度的大小我觉得决定了金字塔的层次,所以我会这么去理解程序员的金字塔。 当然,要打造一款作品,仅有上面的两点能力是不够的,作品里很重要的一点是对业务、技术趋势的判断。 希望作为程序员的大伙,都能有机会打造一款世界级的作品,去为技术圈的发展做出贡献。 由于目前IT技术更新速度还是很快的,程序员这个行当是特别需要学习能力的。我一直认为,只有对程序员这个职业真正的充满兴趣,保持自驱,才有可能在这个职业上做好,否则的话是很容易淘汰的。 作者简介: 毕玄,2007年加入阿里,十多年来主要从事在软件基础设施领域,先后负责阿里的服务框架、Hbase、Sigma、异地多活等重大的基础技术产品和整体架构改造。

茶什i 2020-01-10 15:19:35 0 浏览量 回答数 0

问题

PySpark线性回归数据集中具有比数据点更多的特征

社区小助手 2019-12-01 19:23:37 655 浏览量 回答数 1

问题

【精品问答】Java必备核心知识1000+(附源码)

问问小秘 2019-12-01 22:00:28 870 浏览量 回答数 1

回答

你得到SecurityException: Permission denied (missing INTERNET permission?),明确表示不允许你进行联网。这是一个不争的事实。但这怎么可能发生呢?通常是因为在你的AndroidManifest.xml文件中缺少 ,或者,由于互联网许可是在安装时授予的,而不是在运行时,由于长期存在,Android框架中漏掉了导致应用程序成功安装的错误,但没有预期的权限授予。 我的Manifest是正确的,那么这怎么会发生呢? 理论上uses-permission在Manifest中,完美地满足了需求,从开发人员的角度来看,能够进行联网所需做的就是全部。此外,由于在安装过程中向用户显示了权限,因此你的应用程序在用户设备上安装的事实意味着授予你所要求的权限(否则安装将被取消),因此假设如果你的代码被执行,那么所有请求的权限都被授予是有效的。一旦获得批准,用户除了完全卸载应用程序之外,还不能取消许可,因为标准的Android框架(来自AOSP)目前没有这样的功能。 你可以考虑使用setDefaultUncoghtExceptionHandler()为了在将来捕捉到这样的意外异常,只需向用户显示你的应用程序需要什么样的权限,而不是仅仅是崩溃。 注记 请注意android.permission.INTERNET并不是在清单中声明的唯一与网络相关的权限。有INTERNET授予的权限只允许应用程序打开网络套接字(这基本上是进行任何网络数据传输的基本要求)。但是,如果你的网络堆栈/库也想获得有关网络的信息,那么你也需要android.permission.ACCESS_NETWORK_STATE在你的报表中。 增编(2015-07-16) 请注意,android 6(又名marshmlow)引入了全新的权限管理机制,名为运行时权限。它允许用户更多地控制所授予的权限(还允许有选择的授予),或者让用户撤销已经授予的权限,以便删除应用程序。 然而,这些变化并不影响互联网或接入网络状态权限,这些权限被认为是“正常”权限。用户不需要显式授予这些权限。

游客bnlxddh3fwntw 2020-04-23 19:20:24 0 浏览量 回答数 0

回答

服务器常被攻击表明很可能存在安全漏洞,建议及时查找漏洞,安装补丁、升级系统,并做好服务器的日常防护。 1.设置复杂密码 不要小看密码设置,其对于保持在线安全和保护数据至关重要。创建复杂的云服务密码,字符越多,电脑就越难猜出。特殊字符、数字和字母的随机组合要比姓名或生日更强。 2.杀毒和高防应用 为服务器建立多道防线,杀毒程序通常可以在病毒感染电脑前识别并清除掉。专业的高防服务是应对攻击的最好办法,推荐西部数码的ddos高防,可有效防御各类ddos攻击。 3.保持备份和更新 保持应用程序更新到最新版。如果网站是基于WordPress的,建议把不使用的插件卸载或完全删除,而不只是禁用。在更新之前备份重要数据。另外,仔细检查文件权限,谁有何种级别的权限。 4.部署SSL证书 网站最好使用SSL证书。超过一半以上的网站已经加密了,不要落下。在网页上如需提交敏感信息,优先检查网站域名前是否是https。浏览器会在这种链接前显示一个绿色锁图标。 5.数据库避免敏感信息 存在数据库里的身份证和银行卡信息是易受攻击和盗取的目标。所以,建议不要把此类信息存储在数据库中。 服务器安全这问题,很重要,之前服务器被黑,管理员账号也被篡改,远程端口也登陆不了了。,在网上搜索了一些服务器安全设置以及防黑的文章,对着文章,我一个一个的设置起来,费了好几天的时间才设置完,原以为会防止服务器再次被黑,没想到服务器竟然瘫痪了,网站都打不开了,无奈对服务器安全也是一窍不通,损失真的很大,数据库都损坏了,我哪个后悔啊。娘个咪的。最后还是让机房把系统重装了。找了几个做网站服务器方面的朋友,咨询了关于服务器被黑的解决办法,他们建议找国内最有名的服务器安全的安全公司来给做安全维护,找了sinesafe,服务器被黑的问题,才得以解决。 一路的走来,才知道,服务器安全问题可不能小看了。经历了才知道,服务器安全了给自己带来的也是长远的利益。 希望我的经历能帮到楼主,帮助别人也是在帮助我自己。 下面是一些关于安全方面的建议! 建站一段时间后总能听得到什么什么网站被挂马,什么网站被黑。好像入侵挂马似乎是件很简单的事情。其实,入侵不简单,简单的是你的网站的必要安全措施并未做好。 一:挂马预防措施: 1、建议用户通过ftp来上传、维护网页,尽量不安装asp的上传程序。 2、定期对网站进行安全的检测,具体可以利用网上一些工具,如sinesafe网站挂马检测工具! 序,只要可以上传文件的asp都要进行身份认证! 3、asp程序管理员的用户名和密码要有一定复杂性,不能过于简单,还要注意定期更换。 4、到正规网站下载asp程序,下载后要对其数据库名称和存放路径进行修改,数据库文件名称也要有一定复杂性。 5、要尽量保持程序是最新版本。 6、不要在网页上加注后台管理程序登陆页面的链接。 7、为防止程序有未知漏洞,可以在维护后删除后台管理程序的登陆页面,下次维护时再通过ftp上传即可。 8、要时常备份数据库等重要文件。 9、日常要多维护,并注意空间中是否有来历不明的asp文件。记住:一分汗水,换一分安全! 10、一旦发现被入侵,除非自己能识别出所有木马文件,否则要删除所有文件。 11、对asp上传程序的调用一定要进行身份认证,并只允许信任的人使用上传程序。这其中包括各种新闻发布、商城及论坛程 二:挂马恢复措施: 1.修改帐号密码 不管是商业或不是,初始密码多半都是admin。因此你接到网站程序第一件事情就是“修改帐号密码”。帐号 密码就不要在使用以前你习惯的,换点特别的。尽量将字母数字及符号一起。此外密码最好超过15位。尚若你使用 SQL的话应该使用特别点的帐号密码,不要在使用什么什么admin之类,否则很容易被入侵。 2.创建一个robots.txt Robots能够有效的防范利用搜索引擎窃取信息的骇客。 3.修改后台文件 第一步:修改后台里的验证文件的名称。 第二步:修改conn.asp,防止非法下载,也可对数据库加密后在修改conn.asp。 第三步:修改ACESS数据库名称,越复杂越好,可以的话将数据所在目录的换一下。 4.限制登陆后台IP 此方法是最有效的,每位虚拟主机用户应该都有个功能。你的IP不固定的话就麻烦点每次改一下咯,安全第一嘛。 5.自定义404页面及自定义传送ASP错误信息 404能够让骇客批量查找你的后台一些重要文件及检查网页是否存在注入漏洞。 ASP错误嘛,可能会向不明来意者传送对方想要的信息。 6.慎重选择网站程序 注意一下网站程序是否本身存在漏洞,好坏你我心里该有把秤。 7.谨慎上传漏洞 据悉,上传漏洞往往是最简单也是最严重的,能够让黑客或骇客们轻松控制你的网站。 可以禁止上传或着限制上传的文件类型。不懂的话可以找专业做网站安全的sinesafe公司。 8. cookie 保护 登陆时尽量不要去访问其他站点,以防止 cookie 泄密。切记退出时要点退出在关闭所有浏览器。 9.目录权限 请管理员设置好一些重要的目录权限,防止非正常的访问。如不要给上传目录执行脚本权限及不要给非上传目录给于写入权。 10.自我测试 如今在网上黑客工具一箩筐,不防找一些来测试下你的网站是否OK。 11.例行维护 a.定期备份数据。最好每日备份一次,下载了备份文件后应该及时删除主机上的备份文件。 b.定期更改数据库的名字及管理员帐密。 c.借WEB或FTP管理,查看所有目录体积,最后修改时间以及文件数,检查是文件是否有异常,以及查看是否有异常的账号。 如果服务器系统多了好多用户,不是被攻击。而是服务器被入侵、被黑了。服务器装完系统后,立即打补丁,并关闭不必要的服务和进程。修改服务器为复杂密码,并修改服务器的远程密码;安装服务器安全狗、网站安全狗等防护软件。 来源于网络,供您参考,如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】 希望我的回答对您有所帮助,望采纳! ~ O(∩_∩)O~

保持可爱mmm 2019-12-02 02:24:17 0 浏览量 回答数 0

回答

http://docs.mongoing.com/manual-zh/tutorial/perform-two-phase-commits.html要么操作全都执行,要么都不执行,不能执行一半,改了几条数据了,看哎哟好像不对,那扔着吧。Consistency 在数据库领域的意思跟在分布式系统里的意思不一样,指数据的外部约束有没有满足,比如帐户之间转账,不能最后总和还是负数,或者超过原来的总和了。那文档中的办法是怎么做的呢?简单说,就是在执行操作之前,记下来要做什么,以后可以 redo。然后保证每个操作都是 幂等的 ,就是说重复执行也没事。比如,赋值是幂等的,但是加一个数就不是幂等的。利用 MongoDB 提供的单文档的原子性,使用一些辅助的数据做到幂等,最后把辅助的数据清除掉。如果你的操作本身就是幂等的,那就不需要辅助数据了。如果要 undo,也是可能的,那就要记下如何 undo。但是 ACID 中的 Isolation 是没有的,也就是说事务之间有交叉,别的并发操作可以看到中间不一致的状态,上面说的外部约束只能最终得到保证。比如说,事务 T1 包括 (张三:加100;李四:减100),事务 T2 包括 (张三:加200;李四:减200),如果不加以限制,可能的顺序是:1.T1 (张三:加100)2.T2 (张三:加200)3.T2 (李四:减200)4.T1 (李四:减100)T2 执行的时候可以读取并修改 T1 的中间结果,在转账这个问题上没有大问题,因为加减是 可交换 的操作,先后不影响最终结果。但是如果我们把事务改成 T1 (张三 = 100;李四 = 100)和T2 (张三 = 200;李四 = 200) 这样最终的结果就可能是 (张三 = 200;李四 = 100),有可能就不满足一致性了。但是如果能在应用里保证顺序地执行这两个事务,问题就避免了。大家也了解 Isolation 有几个级别,还有多版本等更复杂的。传统数据库在单机上也会在更强的 Isolation 和性能之间做权衡,提供不同的级别可选。这一点在分布式系统中被称作 Consistency,实现起来的代价就更高了,所以 MongoDB 不支持。不过对大多应用,这并不是太大的问题:1.可能异常情况在逻辑上也是可以接受的,比如微信群发,每个人收到的顺序并不一样。2.可能逻辑上并发就是不可能的,比如一个用户只能修改自己的数据,比如只有一个线程写数据。3.或者把需要的数据放到一个文档里,对单文档,MongoDB 保证原子性,别的操作也不可能看到文档一半被改了。4.或者可以在应用上层发现并解决。比如支付宝转账就自己实现了一套一致性协议,1分钟之内可以保证这一笔数据一致了。对你的要求,如果可以通过修改数据模型,让改动在一个文档里就方便了。最好是看看你具体的需要和应用的假设,分析分析可能出现的异常情况,最后想办法。还有一个办法,贵司可以购买 MongoDB 的支持服务,针对你现在的产品阶段和需求 (开发,维护,咨询,培训),提供不同类型的专业级支持,比再请个程序员 / DevOp / DBA 便宜靠谱多了。

蛮大人123 2019-12-02 01:49:07 0 浏览量 回答数 0

回答

既然要读注册表,那就用MS的东西做,干嘛要用java,用了java就算了,还要搞成exe,这不是蛋疼么?######我只会java呀 ,这是我自己搞定东西 ,呵呵###### 引用来自“情天大圣”的答案 既然要读注册表,那就用MS的东西做,干嘛要用java,用了java就算了,还要搞成exe,这不是蛋疼么? 他java学的好呗。。 直接运行jar包,功能有么有? exe后是功能不在了,还是没运行成功? ######回复 @nnpengjian : 我在异常处理中把他输出到文件了的,运行的时候没有输出来,后来我在那个类里面也试着输出内容到文件,结果也没有输出,这个类好像就没有运行######回复 @陈海刚 : 肯定是有报错信息的,估计你看不见,可以输出到文件,你想办法把报错内容输出来看一下。######功能不在了######应该有啥dll文件没弄过去吧,就像swt的一样。###### @Andre.Z 恩,谢谢了哈######回复 @陈海刚 : 理论上,安装程序能让你把任意文件放在任意位置,还有,可执行文件所在文件夹也是path里面的一个部分,我以前是直接把可执行文件和dll放一个目录的。######回复 @Andre.Z : 把dll文件放在window/system32下面确实可以实现啊,能不能安装的时候让安装程序放到那个文件夹下?######回复 @陈海刚 : 不客气。######回复 @Andre.Z : 恩,谢谢了哈 那我先试一试######最好在程序里实现一个log记录功能。######项目打包好(脱离eclipse环境), 先写个bat 试试。######回复 @西.瓜 : 我是新手一直在搞android,能给个列子吗?Email:329206444@qq.com 先谢了哈######叫我情何以堪……, 批处理文件(建个文本文件,后缀改成bat, 里面写 java -cp xxx 等命令)######只 用过java,请问这个bat怎么写?###### 又见一码农~ ###### @loki_lan 恩,知道了###### @陈海刚 高见谈不上,经验只有一个,多做多学多想。###### @loki_lan 有何高见 ?传授一下经验噻###### @陈海刚 嗯,多点思考多学就不用做码农了~######呵呵,没办法啊。 先做码农吧。。。######干什么不记录日志啊?哎!最基本的东西都不做!######我是新手不要认为我不可救药了啊,说一下怎么记录日志,是不是把一些出错信息保存到文件里头的意思?######你用exe4j这个工具生成exe,配置过程中就有一步是指定输出异常的文件。运行后查看该文件中log。######谢谢

kun坤 2020-06-06 15:48:28 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站