精华内容
下载资源
问答
  • 主要介绍了Tomcat常见异常及解决方案代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了C++常见异常处理原理及代码示例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • public class Test { public static void main(String[] args){ Object[] array = new String[10]; array[0] = new Integer(1); } } Exception in thread "main" java.lang.ArrayStoreException: java.lang....
  • Android常见异常处理

    千次阅读 2017-11-06 11:06:29
    Android常见异常处理什么是异常?Exception是指在程序运行过程中所出现的不可预测的可处理可恢复的问题,这些错误会干扰到指令的正常执行,从而造成程序的异常退出或者意外终止。比如:FileNotFountException、...

    Android常见异常处理

    什么是异常?

    Exception是指在程序运行过程中所出现的不可预测的可处理可恢复的问题,这些错误会干扰到指令的正常执行,从而造成程序的异常退出或者意外终止。比如:FileNotFountException、NullPointException.

    Error是指程序运行过程中较为严重的不可挽回的问题,大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。比如OutOfMemeryError,一旦出现错误程序就要挂。

    @Java中异常和错误都继承自Throwable

    常见异常分类

    编译时错误(比如:ClassNotFoundException)

    从程序语法角度讲是必须进行处理的异常,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常

    运行时错误(比如:ArrayIndexOutOfBoundException)

    这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。
    1、 java.lang.ArrayIndexOutOfBoundsException
    数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
    2、java.lang.ArithmeticException
    算术条件异常。譬如:整数除零等。
    3、java.lang.NullPointerException
    空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等
    4、java.lang.ClassNotFoundException
    找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
    5、java.lang.NegativeArraySizeException 数组长度为负异常
    6、java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常
    7、java.lang.SecurityException 安全性异常
    8、java.lang.IllegalArgumentException 非法参数异常

    异常处理机制

    在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

    Java中防止空指针策略

    1.使用模板方法模式规范生命周期(次序)

        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(getContentView());
            initView();
            mPresenter = initPresenter();
            if(mPresenter != null) {
                mPresenter.attachView(this);
            }
            initData();
        }
    

    2.明确需要创建的对象优先new出来

    private List<Subscription> mSubscriptions = new ArrayList<>();
    

    3.模块内检查非成员变量是否非空(不可靠检查)

    public void setUserData(User user){
        if(user == null) return;
        //TODO
    }
    

    4.return 对象 可能为空写上必要注释

       /**
         * 获取用户数据
         * @return User 可能返回NULL
         */
        public User getUserData(){
    
            return null;
        }
    

    多线程异常

    http://blog.csdn.net/u013256816/article/details/50417822

    Thread的run方法是不抛出任何检查型异常(checked exception)的,但是它自身却可能因为一个异常而被终止,导致这个线程的终结。最麻烦的是,在线程中抛出的异常即使使用try…catch也无法截获,因此可能导致一些问题出现,比如异常的时候无法回收一些系统资源,或者没有关闭当前的连接等等。

    package com.example.uncaughtException;
    
    /**
     * Created by 水寒 on 2017/11/6.
     */
    
    public class NoCaughtThread {
    
        public static void main(String[] args){
            try {
                Thread thread = new Thread(new Task());
                thread.start();
            }catch(Exception e){
                System.out.println("Exception:" + e.getMessage());
            }
    
            System.out.println("Main Thread Started....");
    
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println("Main Thread Sleep 1000....");
        }
    }
    
    class Task implements Runnable{
    
        @Override
        public void run() {
            System.out.println(3 / 2);
            System.out.println(3 / 0);
            System.out.println(3 / 1);
        }
    }
    

    JDK5.0之前,不能为单独的Thread设置UncaughtExceptionHandler,也不能指定一个默认的UncaughtExceptionHandler。为了可以设置一个UncaughtExceptionHandler,需要去继承ThreadGroup并覆写uncaughtException方法。

    在JDK5.0中,我们通过Thread的实例方法setUncaughtExceptionHandler,可以为任何一个Thread设置一个UncaughtExceptionHandler。当然你也可以为所有Thread设置一个默认的UncaughtExceptionHandler,通过调用Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler eh)方法,这是Thread的一个static方法。

    public class NoCaughtThread {
    
        public static void main(String[] args){
            //Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());
            Thread thread = new Thread(new Task());
            thread.setUncaughtExceptionHandler(new ExceptionHandler());
            thread.start();
        }
    }
    
    class ExceptionHandler implements Thread.UncaughtExceptionHandler {
    
        @Override
        public void uncaughtException(Thread thread, Throwable throwable) {
            System.out.println(thread.getName() + " Throw : " + throwable.getMessage());
        }
    }
    

    Android定制错误日志系统

    每当我们app测试的时候,测试人员总是对我们说这里崩溃了,那里挂掉了!我们只能默默接受,然后尝试着重现bug,更可悲的是有时候bug很难复现,为了解决这种现状所以我们要尝试这建立一个自己的bug日志系统。

    Java为我们提供了一个机制,用来捕获并处理在一个线程对象中抛出的未检测异常,以避免程序终止。我们可以通过UncaughtExceptionHandler来实现这种机制。

    package guohe.testkotlin.manager;
    
    import android.app.Application;
    import android.content.Context;
    
    import java.io.PrintWriter;
    import java.io.StringWriter;
    import java.io.Writer;
    
    /**
     * Created by 水寒 on 2017/11/6.
     * 奔溃日志管理
     */
    
    public class CrashManager  implements Thread.UncaughtExceptionHandler{
    
        private static CrashManager mInstance;
        private Application mApplication;
        // 系统默认的UncaughtException处理类
        private Thread.UncaughtExceptionHandler mDefaultHandler;
    
        private CrashManager(Context context){
            mApplication = (Application) context.getApplicationContext();
            mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
            //替换handler, 这是在主线程里执行
            Thread.setDefaultUncaughtExceptionHandler(this);
        }
    
        public static CrashManager getInstance(Context context){
            if(mInstance == null){
                mInstance = new CrashManager(context);
            }
            return mInstance;
        }
    
        @Override
        public void uncaughtException(Thread t, Throwable e) {
            printLog(t, e);
            mDefaultHandler.uncaughtException(t, e);
        }
    
        private void printLog(Thread t, Throwable e){
            Writer writer = new StringWriter();
            PrintWriter printWriter = new PrintWriter(writer);
            e.printStackTrace(printWriter);
            Throwable cause = e.getCause();
            while (cause != null) {
                cause.printStackTrace(printWriter);
                cause = cause.getCause();
            }
            printWriter.close();
            String result = writer.toString();   //这就是异常日志堆栈信息
            System.out.println("Thread:" + t.getName() + ", exception: " + result);
        }
    }
    

    Android Crash处理GitHub开源库

    https://github.com/ACRA/acra

    https://github.com/Sunzxyong/Recovery

    https://github.com/drakeet/CrashWoodpecker

    展开全文
  • 常见网络异常代码

    千次阅读 2019-04-03 11:05:43
    常见的 HTTP 状态代码及其原因• 200 - 成功。 此状态代码表示 IIS 已成功处理请求。• 304 - 未修改。客户端请求的文档已在其缓存中,文档自缓存以来尚未被修改过。客户端使用文档的缓存副本,而不从服务器下载文档...

    HTTP 400 - 请求无效HTTP 401.1 - 未授权:登录失败HTTP 401.2 - 未授权:服务器配置问题导致登录失败HTTP 401.3 - ACL 禁止访问资源HTTP 401.4 - 未授权:授权被筛选器拒绝HTTP 401.5 - 未授权:ISAPI 或 CGI 授权失败

    HTTP 403 - 禁止访问HTTP 403 - 对 Internet 服务管理器 的访问仅限于 LocalhostHTTP 403.1 禁止访问:禁止可执行访问HTTP 403.2 - 禁止访问:禁止读访问HTTP 403.3 - 禁止访问:禁止写访问HTTP 403.4 - 禁止访问:要求 SSLHTTP 403.5 - 禁止访问:要求 SSL 128HTTP 403.6 - 禁止访问:IP 地址被拒绝HTTP 403.7 - 禁止访问:要求客户证书HTTP 403.8 - 禁止访问:禁止站点访问HTTP 403.9 - 禁止访问:连接的用户过多HTTP 403.10 - 禁止访问:配置无效HTTP 403.11 - 禁止访问:密码更改HTTP 403.12 - 禁止访问:映射器拒绝访问HTTP 403.13 - 禁止访问:客户证书已被吊销HTTP 403.15 - 禁止访问:客户访问许可过多HTTP 403.16 - 禁止访问:客户证书不可信或者无效HTTP 403.17 - 禁止访问:客户证书已经到期或者尚未生效 HTTP 404.1 -

    无法找到 Web 站点HTTP 404- 无法找到文件HTTP 405 - 资源被禁止HTTP 406 - 无法接受HTTP 407 - 要求代理身份验证HTTP 410 - 永远不可用HTTP 412 - 先决条件失败HTTP 414 - 请求 - URI 太长HTTP 500 - 内部服务器错误HTTP 500.100 - 内部服务器错误 - ASP 错误HTTP 500-11 服务器关闭HTTP 500-12 应用程序重新启动HTTP 500-13 - 服务器太忙HTTP 500-14 - 应用程序无效HTTP 500-15 - 不允许请求 global.asaError 501 - 未实现HTTP 502 - 网关错误

    用户试图通过 HTTP 或文件传输协议 (FTP) 访问一台正在运行 Internet 信息服务 (IIS) 的服务器上的内容时,IIS 返回一个表示该请求的状态的数字代码。该状态代码记录在 IIS 日志中,同时也可能在 Web 浏览器或 FTP 客户端显示。状态代码可以指明具体请求是否已成功,还可以揭示请求失败的确切原因。日志文件的位置在默认状态下,IIS 把它的日志文件放在 %WINDIRSystem32Logfiles 文件夹中。每个万维网 (WWW) 站点和 FTP 站点在该目录下都有一个单独的目录。在默认状态下,每天都会在这些目录下创建日志文件,并用日期给日志文件命名(例如,exYYMMDD.log)。HTTP1xx - 信息提示

    这些状态代码表示临时的响应。客户端在收到常规响应之前,应准备接收一个或多个 1xx 响应。 • 100 - 继续。• 101 - 切换协议。2xx - 成功

    这类状态代码表明服务器成功地接受了客户端请求。 • 200 - 确定。客户端请求已成功。• 201 - 已创建。• 202 - 已接受。• 203 - 非权威性信息。• 204 - 无内容。• 205 - 重置内容。• 206 - 部分内容。3xx - 重定向

    客户端浏览器必须采取更多操作来实现请求。例如,浏览器可能不得不请求服务器上的不同的页面,或通过代理服务器重复该请求。 • 302 - 对象已移动。• 304 - 未修改。• 307 - 临时重定向。4xx - 客户端错误

    发生错误,客户端似乎有问题。例如,客户端请求不存在的页面,客户端未提供有效的身份验证信息。 • 400 - 错误的请求。• 401 - 访问被拒绝。IIS 定义了许多不同的 401 错误,它们指明更为具体的错误原因。这些具体的错误代码在浏览器中显示,但不在 IIS 日志中显示: • 401.1 - 登录失败。• 401.2 - 服务器配置导致登录失败。• 401.3 - 由于 ACL 对资源的限制而未获得授权。• 401.4 - 筛选器授权失败。• 401.5 - ISAPI/CGI 应用程序授权失败。• 401.7 – 访问被 Web 服务器上的 URL 授权策略拒绝。这个错误代码为 IIS 6.0 所专用。

    • 403 - 禁止访问:IIS 定义了许多不同的 403 错误,它们指明更为具体的错误原因: • 403.1 - 执行访问被禁止。• 403.2 - 读访问被禁止。• 403.3 - 写访问被禁止。• 403.4 - 要求 SSL。• 403.5 - 要求 SSL 128。• 403.6 - IP 地址被拒绝。• 403.7 - 要求客户端证书。• 403.8 - 站点访问被拒绝。• 403.9 - 用户数过多。• 403.10 - 配置无效。• 403.11 - 密码更改。• 403.12 - 拒绝访问映射表。• 403.13 - 客户端证书被吊销。• 403.14 - 拒绝目录列表。• 403.15 - 超出客户端访问许可。• 403.16 - 客户端证书不受信任或无效。• 403.17 - 客户端证书已过期或尚未生效。• 403.18 - 在当前的应用程序池中不能执行所请求的 URL。这个错误代码为 IIS 6.0 所专用。• 403.19 - 不能为这个应用程序池中的客户端执行 CGI。这个错误代码为 IIS 6.0 所专用。• 403.20 - Passport 登录失败。这个错误代码为 IIS 6.0 所专用。

    • 404 - 未找到。 • 404.0 -(无) – 没有找到文件或目录。• 404.1 - 无法在所请求的端口上访问 Web 站点。• 404.2 - Web 服务扩展锁定策略阻止本请求。• 404.3 - MIME 映射策略阻止本请求。

    • 405 - 用来访问本页面的 HTTP 谓词不被允许(方法不被允许)• 406 - 客户端浏览器不接受所请求页面的 MIME 类型。• 407 - 要求进行代理身份验证。• 412 - 前提条件失败。• 413 – 请求实体太大。• 414 - 请求 URI 太长。• 415 – 不支持的媒体类型。• 416 – 所请求的范围无法满足。• 417 – 执行失败。• 423 – 锁定的错误。5xx - 服务器错误

    服务器由于遇到错误而不能完成该请求。 • 500 - 内部服务器错误。 • 500.12 - 应用程序正忙于在 Web 服务器上重新启动。• 500.13 - Web 服务器太忙。• 500.15 - 不允许直接请求 Global.asa。• 500.16 – UNC 授权凭据不正确。这个错误代码为 IIS 6.0 所专用。• 500.18 – URL 授权存储不能打开。这个错误代码为 IIS 6.0 所专用。• 500.100 - 内部 ASP 错误。

    • 501 - 页眉值指定了未实现的配置。• 502 - Web 服务器用作网关或代理服务器时收到了无效响应。 • 502.1 - CGI 应用程序超时。• 502.2 - CGI 应用程序出错。application.

    • 503 - 服务不可用。这个错误代码为 IIS 6.0 所专用。• 504 - 网关超时。• 505 - HTTP 版本不受支持。

    常见的 HTTP 状态代码及其原因• 200 - 成功。 此状态代码表示 IIS 已成功处理请求。• 304 - 未修改。客户端请求的文档已在其缓存中,文档自缓存以来尚未被修改过。客户端使用文档的缓存副本,而不从服务器下载文档。• 401.1 - 登录失败。 登录尝试不成功,可能因为用户名或密码无效。• 401.3 - 由于 ACL 对资源的限制而未获得授权。 这表示存在 NTFS 权限问题。即使您对试图访问的文件具备相应的权限,也可能发生此错误。例如,如果 IUSR 帐户无权访问 C:WinntSystem32Inetsrv 目录,您会看到这个错误。 有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:187506 INFO: IIS 4.0 的基础 NTFS 权限• 403.1 - 执行访问被禁止。 下面是导致此错误信息的两个常见原因: • 您没有足够的执行许可。例如,如果试图访问的 ASP 页所在的目录权限设为“无”,或者,试图执行的 CGI 脚本所在的目录权限为“只允许脚本”,将出现此错误信息。若要修改执行权限,请在 Microsoft 管理控制台 (MMC) 中右击目录,然后依次单击属性和目录选项卡,确保为试图访问的内容设置适当的执行权限。• 您没有将试图执行的文件类型的脚本映射设置为识别所使用的谓词(例如,GET 或 POST)。若要验证这一点,请在 MMC 中右击目录,依次单击属性、目录选项卡和配置,然后验证相应文件类型的脚本映射是否设置为允许所使用的谓词。

    • 403.2 - 读访问被禁止。验证是否已将 IIS 设置为允许对目录进行读访问。另外,如果您正在使用默认文件,请验证该文件是否存在。有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:247677 错误信息:403.2 Forbidden:Read Access Forbidden(403.2 禁止访问:读访问被禁止)• 403.3 - 写访问被禁止。 验证 IIS 权限和 NTFS 权限是否已设置以便向该目录授予写访问权。有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:248072 错误信息:403.3 Forbidden:Write Access Forbidden(403.3 禁止访问:写访问被禁止)• 403.4 - 要求 SSL。禁用要求安全通道选项,或使用 HTTPS 代替 HTTP 来访问该页面。如果没有安装证书的 Web 站点出现此错误,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:224389 错误信息:HTTP 错误 403、403.4、403.5 禁止访问:要求 SSL• 403.5 - 要求 SSL 128。禁用要求 128 位加密选项,或使用支持 128 位加密的浏览器以查看该页面。如果没有安装证书的 Web 站点出现此错误,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:224389 错误信息:HTTP 错误 403、403.4、403.5 禁止访问:要求 SSL• 403.6 - IP 地址被拒绝。您已把您的服务器配置为拒绝访问您目前的 IP 地址。有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:248043 错误信息:403.6 - Forbidden:IP Address Rejected(403.6 - 不可用:IP 地址被拒绝)• 403.7 - 要求客户端证书。您已把您的服务器配置为要求客户端身份验证证书,但您未安装有效的客户端证书。有关其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:190004 错误 403.7 或“Connection to Server Could Not Be Established”(无法建立与服务器的连接)186812 PRB:错误信息:403.7 Forbidden:Client Certificate Required(403.7 禁止访问:要求客户端证书)• 403.8 - 站点访问被拒绝。您已为您用来访问服务器的域设置了域名限制。有关如何解决此问题的其他信息,请单击下面的文章编号,查看 Microsoft 知识库中相应的文章:248032 错误信息:Forbidden:Site Access Denied 403.8(禁止访问:站点访问被拒绝 403.8)• 403.9 - 用户数过多。与该服务器连接的用户数量超过了您设置的连接限制。有关如何更改此限制的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:248074 错误信息:Access Forbidden:Too Many Users Are Connected 403.9(禁止访问:连接的用户太多 403.9)注意:Microsoft Windows 2000 Professional 和 Microsoft Windows XP Professional 自动设置了在 IIS 上最多 10 个连接的限制。您无法更改此限制。• 403.12 - 拒绝访问映射表。 您要访问的页面要求提供客户端证书,但映射到您的客户端证书的用户 ID 已被拒绝访问该文件。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:248075 错误信息:HTTP 403.12 - Access Forbidden:Mapper Denied Access(HTTP 403.12 - 禁止访问:映射表拒绝访问)• 404 - 未找到。 发生此错误的原因是您试图访问的文件已被移走或删除。如果在安装 URLScan 工具之后,试图访问带有有限扩展名的文件,也会发生此错误。这种情况下,该请求的日志文件项中将出现“Rejected by URLScan”的字样。• 500 - 内部服务器错误。 很多服务器端的错误都可能导致该错误信息。事件查看器日志包含更详细的错误原因。此外,您可以禁用友好 HTTP 错误信息以便收到详细的错误说明。 有关如何禁用友好 HTTP 错误信息的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:294807 如何在服务器端禁用 Internet Explorer 5 的“显示友好 HTTP 错误信息”功能• 500.12 - 应用程序正在重新启动。 这表示您在 IIS 重新启动应用程序的过程中试图加载 ASP 页。刷新页面后,此信息即会消失。如果刷新页面后,此信息再次出现,可能是防病毒软件正在扫描 Global.asa 文件。有关其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:248013 错误信息:HTTP Error 500-12 Application Restarting(HTTP 错误 500-12 应用程序正在重新启动)• 500-100.ASP - ASP 错误。 如果试图加载的 ASP 页中含有错误代码,将出现此错误信息。若要获得更确切的错误信息,请禁用友好 HTTP 错误信息。默认情况下,只会在默认 Web 站点上启用此错误信息。有关如何在非默认的 Web 站点上看到此错误信息的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:261200 显示 HTTP 500 错误信息,而不显示 500-100.asp 的 ASP 错误信息• 502 - 网关错误。 如果试图运行的 CGI 脚本不返回有效的 HTTP 标头集,将出现此错误信息。

    FTP1xx - 肯定的初步答复

    这些状态代码指示一项操作已经成功开始,但客户端希望在继续操作新命令前得到另一个答复。 • 110 重新启动标记答复。• 120 服务已就绪,在 nnn 分钟后开始。• 125 数据连接已打开,正在开始传输。• 150 文件状态正常,准备打开数据连接。2xx - 肯定的完成答复

    一项操作已经成功完成。客户端可以执行新命令。 • 200 命令确定。• 202 未执行命令,站点上的命令过多。• 211 系统状态,或系统帮助答复。• 212 目录状态。• 213 文件状态。• 214 帮助消息。• 215 NAME 系统类型,其中,NAME 是 Assigned Numbers 文档中所列的正式系统名称。• 220 服务就绪,可以执行新用户的请求。• 221 服务关闭控制连接。如果适当,请注销。• 225 数据连接打开,没有进行中的传输。• 226 关闭数据连接。请求的文件操作已成功(例如,传输文件或放弃文件)。• 227 进入被动模式 (h1,h2,h3,h4,p1,p2)。• 230 用户已登录,继续进行。• 250 请求的文件操作正确,已完成。• 257 已创建“PATHNAME”。3xx - 肯定的中间答复

    该命令已成功,但服务器需要更多来自客户端的信息以完成对请求的处理。 • 331 用户名正确,需要密码。• 332 需要登录帐户。• 350 请求的文件操作正在等待进一步的信息。4xx - 瞬态否定的完成答复

    该命令不成功,但错误是暂时的。如果客户端重试命令,可能会执行成功。 • 421 服务不可用,正在关闭控制连接。如果服务确定它必须关闭,将向任何命令发送这一应答。• 425 无法打开数据连接。• 426 Connection closed; transfer aborted.• 450 未执行请求的文件操作。文件不可用(例如,文件繁忙)。• 451 请求的操作异常终止:正在处理本地错误。• 452 未执行请求的操作。系统存储空间不够。5xx - 永久性否定的完成答复

    该命令不成功,错误是永久性的。如果客户端重试命令,将再次出现同样的错误。 • 500 语法错误,命令无法识别。这可能包括诸如命令行太长之类的错误。• 501 在参数中有语法错误。• 502 未执行命令。• 503 错误的命令序列。• 504 未执行该参数的命令。• 530 未登录。• 532 存储文件需要帐户。• 550 未执行请求的操作。文件不可用(例如,未找到文件,没有访问权限)。• 551 请求的操作异常终止:未知的页面类型。• 552 请求的文件操作异常终止:超出存储分配(对于当前目录或数据集)。• 553 未执行请求的操作。不允许的文件名。

    															转自百度知道
    
    展开全文
  • 主要介绍了Java编程常见内存溢出异常代码示例,具有一定参考价值,需要的朋友可以了解下。
  • 主要介绍了java程序常见异常及处理汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 常见异常处理方案

    2008-03-16 18:10:06
    java常见异常处理方案
  • Jedis常见异常汇总

    万次阅读 2018-03-19 20:00:01
    (1) 常见原因:多个线程使用一个Jedis连接,正常的情况是一个线程使用一个Jedis连接,可以使用JedisPool管理Jedis连接,实现线程安全,防止出现这种情况,例如下面代码中两个线程用了一个Jedis连接: new Thread( ...

    Jedis虽然使用起来比较简单,但是如果不能根据使用场景设置合理的参数(例如连接池参数),不合理的使用一些功能(例如Lua和事务)也会产生很多问题,本文对这些问题逐个说明:

    详细目录:

    • 一、redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
    • 二、redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream
    • 三、redis.clients.jedis.exceptions.JedisDataException: ERR illegal address
    • 四、redis.clients.jedis.exceptions.JedisDataException: ERR max number of clients reached
    • 五、redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out
    • 六、redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required
    • 七、redis.clients.jedis.exceptions.JedisDataException: EXECABORT Transaction discarded because of previous errors
    • 八、java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.List
    • 九、redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
    • 十、redis.clients.jedis.exceptions.JedisDataException: OOM command not allowed when used memory > 'maxmemory'
    • 十一、redis.clients.jedis.exceptions.JedisDataException: LOADING Redis is loading the dataset in memory
    • 十二、redis.clients.jedis.exceptions.JedisDataException: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.
    • 十三、redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out
    • 十四、UNKILLABLE Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in a hard way using the SHUTDOWN NOSAVE command.
    • 十五、java.lang.NoClassDefFoundError
    • 十六、redis.clients.jedis.exceptions.JedisDataException: ERR unknown command
    • 十七、redis.clients.jedis.exceptions.JedisDataException: Please close pipeline or multi block before calling this method.
    • 十八、redis.clients.jedis.exceptions.JedisDataException: ERR command role not support for normal user.

    一.无法从连接池获取到Jedis连接

    1.异常堆栈

    (1) 连接池参数blockWhenExhausted = true(默认)

    如果连接池没有可用Jedis连接,会等待maxWaitMillis(毫秒),依然没有获取到可用Jedis连接,会抛出如下异常:

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolCaused by: java.util.NoSuchElementException: Timeout waiting for idle object
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:449)

    (2) 连接池参数blockWhenExhausted = false

    设置如果连接池没有可用Jedis连接,立即抛出异常:

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the poolCaused by: java.util.NoSuchElementException: Pool exhausted
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:464)

    2.异常描述

    1

    上述异常是客户端没有从连接池(最大maxTotal个)拿到可用Jedis连接造成的,具体可能有如下原因:

    (1) 连接泄露 (较为常见)

    JedisPool默认的maxTotal=8,下面的代码从JedisPool中借了8次Jedis,但是没有归还,当第9次(jedisPool.getResource().ping())

    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
    //向JedisPool借用8次连接,但是没有执行归还操作。
    for (int i = 0; i < 8; i++) {
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.ping();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }
    }
    jedisPool.getResource().ping();

    所以推荐使用的代码规范是:

    执行命令如下:
    Jedis jedis = null;
    try {
        jedis = jedisPool.getResource();
        //具体的命令
        jedis.executeCommand()
    } catch (Exception e) {
        //如果命令有key最好把key也在错误日志打印出来,对于集群版来说通过key可以帮助定位到具体节点。
        logger.error(e.getMessage(), e);
    } finally {
        //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
        if (jedis != null) 
            jedis.close();
    }

    (2) 业务并发量大,maxTotal确实设置小了。

    举个例子:

    • 一次命令时间(borrow|return resource + Jedis执行命令(含网络) )的平均耗时约为1ms,一个连接的QPS大约是1000
    • 业务期望的QPS是50000

    那么理论上需要的资源池大小是50000 / 1000 = 50个,实际maxTotal可以根据理论值进行微调。

    (3) Jedis连接还的太慢

    例如Redis发生了阻塞(例如慢查询等原因),所有连接在超时时间范围内等待,并发量较大时,会造成连接池资源不足。

    (4) 其他问题

    例如丢包、DNS、客户端TCP参数配置,具体可以参考:Jedis介绍及常见问题分析

    3.解决方法:

    可以看到这个问题稍微复杂一些,不要被异常的表象所迷惑,简单地认为连接池不够就盲目加大maxTotal,要具体问题具体分析。

    连接池参数优化可以参考:JedisPool资源池优化

    4.处理人

    客户先确认,如解决不了,需要借助工单解决

    还有一种情况是:从池子里拿连接,由于没有空闲连接,需要重新生成一个Jedis连接,但是连接被拒绝:

    redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
        at redis.clients.util.Pool.getResource(Pool.java:50)
        at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99)
        at TestAdmin.main(TestAdmin.java:14)
    Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused
        at redis.clients.jedis.Connection.connect(Connection.java:164)
        at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80)
        at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1676)
        at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:87)
        at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:861)
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
        at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
        at redis.clients.util.Pool.getResource(Pool.java:48)
        ... 2 more
    Caused by: java.net.ConnectException: Connection refused
        at java.net.PlainSocketImpl.socketConnect(Native Method)
        at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
        at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:579)
        at redis.clients.jedis.Connection.connect(Connection.java:158)
        ... 9 more

    可以从at redis.clients.jedis.Connection.connect(Connection.java:158)看到实际是一个Socket连接:

     socket.setSoLinger(true, 0); // Control calls close () method,
            // the underlying socket is closed
            // immediately
            // <-@wjw_add
    
    158:  socket.connect(new InetSocketAddress(host, port), connectionTimeout);

    一般这种需要检查Redis的域名配置是否正确,排查该段时间网络是否正常

    二、客户端缓冲区异常

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisConnectionException: Unexpected end of stream.
        at redis.clients.util.RedisInputStream.ensureFill(RedisInputStream.java:199)
        at redis.clients.util.RedisInputStream.readByte(RedisInputStream.java:40)
        at redis.clients.jedis.Protocol.process(Protocol.java:151)
    ......

    2.异常描述:

    这个异常是客户端缓冲区异常,产生这个问题可能有三个原因:

    (1) 常见原因:多个线程使用一个Jedis连接,正常的情况是一个线程使用一个Jedis连接,可以使用JedisPool管理Jedis连接,实现线程安全,防止出现这种情况,例如下面代码中两个线程用了一个Jedis连接:

    new Thread(new Runnable() {
    
        public void run() {
            for (int i = 0; i < 100; i++) {
                jedis.get("hello");
            }
        }
    }).start();
    
    new Thread(new Runnable() {
    
        public void run() {
            for (int i = 0; i < 100; i++) {
                jedis.hget("haskey", "f");
            }
        }
    }).start();

    (2) 客户端缓冲区满了

    Redis有三种客户端缓冲区:

    • 普通客户端缓冲区(normal):用于接受普通的命令,例如get、set、mset、hgetall、zrange等
    • slave客户端缓冲区(slave):用于同步master节点的写命令,完成复制。
    • 发布订阅缓冲区(pubsub):pubsub不是普通的命令,因此有单独的缓冲区。

    客户端缓冲区

    Redis的客户端缓冲区配置具体格式是:

    client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>

    (a) class: 客户端类型:(a) normal、(b) slave、(c) pubsub

    (b) hard limit: 如果客户端使用的输出缓冲区大于hard limit,客户端会被立即关闭。

    (c) soft limit和soft seconds: 如果客户端使用的输出缓冲区超过了soft limit并且持续了soft limit秒,客户端会被立即关闭

    例如下面是一份Redis缓冲区的配置,所以当条件满足时,客户端连接会被关闭,就会出现Unexpected end of stream。

    redis> config get client-output-buffer-limit
    1) "client-output-buffer-limit"
    2) "normal 524288000 0 0 slave 2147483648 536870912 480 pubsub 33554432 8388608 60"

    (3) 长时间闲置连接被服务端主动断开,可以查询timeout配置的设置以及自身连接池配置是否需要做空闲检测。

    3.解决方法和处理人:

    客户:排查自身代码是否使用JedisPool管理Jedis连接,是否存在并发操作Jedis的情况。

    工单: 排查(2)(3),阿里云Redis中timeout=0,也就是不会主动关闭空闲连接,缓冲区设置为0 0 0 也就是不会对客户端缓冲区进行限制,一般不会有问题

    三、非法客户端地址 (阿里云Redis提供客户端白名单功能)

    1.异常堆栈

    Caused by: redis.clients.jedis.exceptions.JedisDataException: ERR illegal address
        at redis.clients.jedis.Protocol.processError(Protocol.java:117)
        at redis.clients.jedis.Protocol.process(Protocol.java:151)
        at redis.clients.jedis.Protocol.read(Protocol.java:205)
        ......

    2.异常描述:

    Redis实例配置了白名单,但当前访问Redis的客户端(IP)不在白名单中。

    3.解决方法:

    添加该客户端(IP)的白名单

    4.处理人

    客户或者工单都可以

    四、客户端连接数达到最大值

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisDataException: ERR max number of clients reached

    2.异常描述:

    如果客户端连接数超过了Redis实例配置的最大maxclients

    3.解决方法:

    提工单帮助临时调大最大连接数,并让客户找到连接数暴涨的原因(因为上述调整只是临时调整),

    4.处理人

    • 工单:临时调整最大连接数,协助定位问题
    • 客户:定位自身问题(可以定位连接最多的客户端),找到问题原因(例如连接池配置等)

    五、客户端读写超时

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: Read timed out

    2.异常描述:

    该问题原因可能有如下几种:
    (1) 读写超时设置的过短。
    (2) 有慢查询或者Redis发生阻塞。
    (3) 网络不稳定。

    3.解决方法:

    客户提供读写超时时间,提交工单定位相关原因

    4.处理人:

    工单。

    六、密码相关的异常

    1.异常堆栈

    Redis设置了密码,客户端请求没传密码:

    Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: NOAUTH Authentication required.
         at redis.clients.jedis.Protocol.processError(Protocol.java:127)
         at redis.clients.jedis.Protocol.process(Protocol.java:161)
         at redis.clients.jedis.Protocol.read(Protocol.java:215)

    Redis没有设置密码,客户端传了密码:

    Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set
         at redis.clients.jedis.Protocol.processError(Protocol.java:127)
         at redis.clients.jedis.Protocol.process(Protocol.java:161)
         at redis.clients.jedis.Protocol.read(Protocol.java:215)

    客户端传了错误的密码:

    redis.clients.jedis.exceptions.JedisDataException: ERR invalid password
        at redis.clients.jedis.Protocol.processError(Protocol.java:117)
        at redis.clients.jedis.Protocol.process(Protocol.java:151)
        at redis.clients.jedis.Protocol.read(Protocol.java:205)
    

    2.解决方法:弄清楚到底有没有密码,密码是否正确。

    七、事务异常

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisDataException: EXECABORT Transaction discarded because of previous errors

    2.异常描述:

    这个是Redis的事务异常:事务中包含了错误的命令,例如如下sett是个不存在的命令。

    127.0.0.1:6379> multi
    OK
    127.0.0.1:6379> sett key world
    (error) ERR unknown command 'sett'
    127.0.0.1:6379> incr counter
    QUEUED
    127.0.0.1:6379> exec
    (error) EXECABORT Transaction discarded because of previous errors.

    3.解决方法和处理人:

    客户修复自身代码错误。

    八、类转换错误

    1.异常堆栈

    java.lang.ClassCastException: java.lang.Long cannot be cast to java.util.List
             at redis.clients.jedis.Connection.getBinaryMultiBulkReply(Connection.java:199)
             at redis.clients.jedis.Jedis.hgetAll(Jedis.java:851)
             at redis.clients.jedis.ShardedJedis.hgetAll(ShardedJedis.java:198)   
    java.lang.ClassCastException: java.util.ArrayList cannot be cast to [B
             at redis.clients.jedis.Connection.getBinaryBulkReply(Connection.java:182)
             at redis.clients.jedis.Connection.getBulkReply(Connection.java:171)
             at redis.clients.jedis.Jedis.rpop(Jedis.java:1109)
             at redis.clients.jedis.ShardedJedis.rpop(ShardedJedis.java:258)
    .......

    2.异常描述:

    Jedis正确的使用方法是:一个线程操作一个Jedis,通常来讲产生该错误是由于没有使用JedisPool造成的,例如如下代码在两个线程并发使用了一个Jedis。(get、hgetAll返回类型也是不一样的)

    
    new Thread(new Runnable() {
    
        public void run() {
            for (int i = 0; i < 100; i++) {
                jedis.set("hello", "world");
                jedis.get("hello");
            }
        }
    }).start();
    
    new Thread(new Runnable() {
    
        public void run() {
            for (int i = 0; i < 100; i++) {
                jedis.hset("hashkey", "f", "v");
                jedis.hgetAll("hashkey");
            }
        }
    }).start();

    3.解决方法和处理人:

    客户排查自身代码是否存在上述问题

    九、命令使用错误

    1.异常堆栈

    Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
        at redis.clients.jedis.Protocol.processError(Protocol.java:127)
        at redis.clients.jedis.Protocol.process(Protocol.java:161)
        at redis.clients.jedis.Protocol.read(Protocol.java:215)
    .....

    2.异常描述:

    例如key="hello"是字符串类型的键,而hgetAll是哈希类型的键,所以出现了错误。

    jedis.set("hello","world");
    jedis.hgetAll("hello");

    3.解决方法和处理人:

    请客户修改自身代码错误。

    十、Redis使用的内存超过maxmemory配置

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisDataException: OOM command not allowed when used memory > 'maxmemory'.

    2.异常描述:

    Redis节点(如果是集群,则是其中一个节点)使用大于该实例的内存规格(maxmemory配置)。

    3.解决方法:

    原因可能有以下几个:

    • 业务数据正常增加
    • 客户端缓冲区异常:例如使用了monitor、pub/sub使用不当等等
    • 纯缓存使用场景,但是maxmemory-policy配置有误(例如没有过期键的业务配置volatile-lru)

    紧急处理,可以临时提工单帮助临时调整maxmeory,后续咨询用户是否升配或者调整配置。

    4.处理人

    • 客户:找到内存增大的原因。
    • 工单:协助临时调整maxmeomry,如果客户需要,可以协助解决

    十一、Redis正在加载持久化文件

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisDataException: LOADING Redis is loading the dataset in memory

    2.异常描述:

    Jedis调用Redis时,如果Redis正在加载持久化文件,无法进行正常的读写。

    3.解决方法:

    正常情况下,阿里云Redis不会出现这种情况,如果出现,则提交工单处理。

    4.处理人:

    工单。

    十二、Lua脚本超时

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisDataException: BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.

    2.异常描述:

    如果Redis当前正在执行Lua脚本,并且超过了lua-time-limit,此时Jedis调用Redis时,会收到下面的异常

    3.解决方法:

    按照异常提示:You can only call SCRIPT KILL or SHUTDOWN NOSAVE. (使用script kill:kill掉Lua脚本)

    4.处理人:

    最好客户自己处理,如果解决不了,值班人员可以协助操作。

    十三 连接超时

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketTimeoutException: connect timed out

    2.异常描述:

    可能产生的原因:

    • 连接超时设置的过短。
    • tcp-backlog满,造成新的连接失败。
    • 客户端与服务端网络不正常。

    3.解决方法:

    客户提供连接超时时间,提交工单定位相关原因。

    4.处理人:

    工单。

    十四 Lua脚本写超时

    1.异常堆栈

    (error) UNKILLABLE Sorry the script already executed write commands against the dataset. You can either wait the script termination or kill the server in a hard way using the SHUTDOWN NOSAVE command.

    2.异常描述:

    如果Redis当前正在执行Lua脚本,并且超过了lua-time-limit,并且已经执行过写命令,此时Jedis调用Redis时,会收到上面的异常

    3.解决方法:

    提交工单做紧急处理,管理员要做重启或者切换Redis节点。

    4.处理人:

    工单。

    十五、类加载错误

    1.异常堆栈

    例如找不到类和方法:

    Exception in thread "commons-pool-EvictionTimer" java.lang.NoClassDefFoundError: redis/clients/util/IOUtils
        at redis.clients.jedis.Connection.disconnect(Connection.java:226)
        at redis.clients.jedis.BinaryClient.disconnect(BinaryClient.java:941)
        at redis.clients.jedis.BinaryJedis.disconnect(BinaryJedis.java:1771)
        at redis.clients.jedis.JedisFactory.destroyObject(JedisFactory.java:91)
        at         org.apache.commons.pool2.impl.GenericObjectPool.destroy(GenericObjectPool.java:897)
        at org.apache.commons.pool2.impl.GenericObjectPool.evict(GenericObjectPool.java:793)
        at org.apache.commons.pool2.impl.BaseGenericObjectPool$Evictor.run(BaseGenericObjectPool.java:1036)
        at java.util.TimerThread.mainLoop(Timer.java:555)
        at java.util.TimerThread.run(Timer.java:505)
    Caused by: java.lang.ClassNotFoundException: redis.clients.util.IOUtils
    ......

    2.异常描述:

    运行时,Jedis执行命令,抛出异常:某个类找不到。一般此类问题都是由于加载多个jedis版本(例如jedis 2.9.0和jedis 2.6),在编译期代码未出现问题,但类加载器在运行时加载了低版本的Jedis,造成运行时找不到类。

    3.解决方法:

    通常此类问题,可以将重复的jedis排除掉,例如利用maven的依赖树,把无用的依赖去掉或者exclusion掉。

    4.处理人

    客户排查自身代码

    十六、服务端命令不支持

    1.异常堆栈

    例如客户端执行了geoadd命令,但是服务端返回不支持此命令

    redis.clients.jedis.exceptions.JedisDataException: ERR unknown command 'GEOADD'

    2.异常描述:

    该命令不能被Redis端识别,有可能有两个原因:

    • 社区版的一些命令,阿里云Redis的不支持,或者只在某些小版本上支持(例如geoadd是Redis 3.2添加的地理信息api)。
    • 命令本身是错误的(不过对于Jedis来说还好,不支持直接组装命令,每个API都有固定的函数)。

    3.解决方法:

    咨询是否有Redis版本支持该命令,如支持可以让客户做小版本升级。

    4.处理人

    • 管理员:确认版本是否支持该命令
    • 客户:确认后,做小版本升级

    十七、pipeline错误使用

    1.异常堆栈

    redis.clients.jedis.exceptions.JedisDataException: Please close pipeline or multi block before calling this method.

    2.异常描述:

    在pipeline.sync()执行之前,通过response.get()获取值,在pipeline.sync()执行前,命令没有执行(可以通过monitor做验证),下面代码就会引起上述异常

    Jedis jedis = new Jedis("127.0.0.1", 6379);
    Pipeline pipeline = jedis.pipelined();
    pipeline.set("hello", "world"); 
    pipeline.set("java", "jedis");
        
    Response<String> pipeString = pipeline.get("java");
    //这个get必须在sync之后,如果是批量获取值建议直接用List<Object> objectList = pipeline.syncAndReturnAll();
    System.out.println(pipeString.get());
    //命令此时真正执行
    pipeline.sync();

    Jedis中Reponse中get()方法,有个判断:如果set=false就会报错,而response中的set初始化为false.

    public T get() {
      // if response has dependency response and dependency is not built,
      // build it first and no more!!
      if (dependency != null && dependency.set && !dependency.built) {
        dependency.build();
      }
      if (!set) {
        throw new JedisDataException(
            "Please close pipeline or multi block before calling this method.");
      }
      if (!built) {
        build();
      }
      if (exception != null) {
        throw exception;
      }
      return response;
    }

    pipeline.sync()会每个结果设置set=true。

    public void sync() {
      if (getPipelinedResponseLength() > 0) {
        List<Object> unformatted = client.getAll();
        for (Object o : unformatted) {
          generateResponse(o);
        }
      }
    }

    其中generateResponse(o):

    protected Response<?> generateResponse(Object data) {
      Response<?> response = pipelinedResponses.poll();
      if (response != null) {
        response.set(data);
      }
      return response;
    }

    其中response.set(data);

    public void set(Object data) {
        this.data = data;
        set = true;
    }

    3.解决方法:

    实际上对于批量结果的解析,建议使用pipeline.syncAndReturnAll()来实现,下面操作模拟了批量hgetAll

    
    /**
    * pipeline模拟批量hgetAll
    * @param keyList
    * @return
    */
    public Map<String, Map<String, String>> mHgetAll(List<String> keyList) {
    // 1.生成pipeline对象
    Pipeline pipeline = jedis.pipelined();
    // 2.pipeline执行命令,注意此时命令并未真正执行
    for (String key : keyList) {
      pipeline.hgetAll(key);
    }
    // 3.执行命令 syncAndReturnAll()返回结果
    List<Object> objectList = pipeline.syncAndReturnAll();
    if (objectList == null || objectList.isEmpty()) {
      return Collections.emptyMap();
    }
        
    // 4.解析结果
    Map<String,Map<String, String>> resultMap = new HashMap<String, Map<String,String>>();
    for (int i = 0; i < objectList.size(); i++) {
      Object object = objectList.get(i);
      Map<String, String> map = (Map<String, String>) object;
      String key = keyList.get(i);
      resultMap.put(key, map);
    }
    return resultMap;
    }

    4.处理人:

    修改业务代码。

    十八、管理员命令,普通用户不能执行

    1.异常堆栈

    命令role不能被普通用户执行,可以参考暂未开放的Redis命令

    redis.clients.jedis.exceptions.JedisDataException: ERR command role not support for normal user

    2.异常描述:

    改命令尚未开放

    3.解决方法:

    不能使用该命令,如果有需求或者疑问可以联系值班人员。

    4.处理人

    从文档中确认该命令是否开放

    其他问题:

    1.Jedis版本如何选择:

    原则上选择最新的release版本,但最好选择release一段时间后的版本,因为jedis历史上出现过一次问题较大的release版本,目前来说2.9.0比较稳定。

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>2.9.0</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>

    2.Jedis中的JedisCluster是阿里云Redis集群版的客户端吗?

    答:不是,使用阿里云集群版的客户端,直接使用Jedis和JedisPool即可。因为官方集群和阿里云Redis集群是不同的架构,具体参考:redis4.0、codis、阿里云redis 3种redis集群对比分析

    ......其他待补充......

    附赠连接池参数

    1. 资源设置和使用

    序号参数名含义默认值使用建议
    1maxTotal资源池中最大连接数8设置建议见下节
    2maxIdle资源池允许最大空闲的连接数8设置建议见下节
    3minIdle资源池确保最少空闲的连接数0设置建议见下节
    4blockWhenExhausted当资源池用尽后,调用者是否要等待。只有当为true时,下面的maxWaitMillis才会生效true建议使用默认值
    5maxWaitMillis当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)-1:表示永不超时不建议使用默认值
    6testOnBorrow向资源池借用连接时是否做连接有效性检测(ping),无效连接会被移除false业务量很大时候建议设置为false(多一次ping的开销)。
    7testOnReturn向资源池归还连接时是否做连接有效性检测(ping),无效连接会被移除false业务量很大时候建议设置为false(多一次ping的开销)。
    8jmxEnabled是否开启jmx监控,可用于监控true建议开启,但应用本身也要开启

    2.空闲资源监测

    空闲Jedis对象检测,下面四个参数组合来完成,testWhileIdle是该功能的开关。

    序号参数名含义默认值使用建议
    1testWhileIdle是否开启空闲资源监测falsetrue
    2timeBetweenEvictionRunsMillis空闲资源的检测周期(单位为毫秒)-1:不检测建议设置,周期自行选择,也可以默认也可以使用下面JedisPoolConfig中的配置
    3minEvictableIdleTimeMillis资源池中资源最小空闲时间(单位为毫秒),达到此值后空闲资源将被移除1000 60 30 = 30分钟可根据自身业务决定,大部分默认值即可,也可以考虑使用下面JeidsPoolConfig中的配置
    4numTestsPerEvictionRun做空闲资源检测时,每次的采样数3可根据自身应用连接数进行微调,如果设置为-1,就是对所有连接做空闲监测

    参考来源:https://yq.aliyun.com/articles/236384?spm=a2c4e.11155435.0.0.e21e2612uQAVoW#cc1

    展开全文
  • 调试代码常见异常错误:

    调试代码常见的异常错误:

    展开全文
  • 微信小程序常见异常

    千次阅读 2020-01-10 16:58:30
    小程序常见异常 文章目录小程序常见异常1.查找数据时,条件中ReferenceError: _ is not defined2.this.data和this.setData不生效3.悬浮按钮覆盖内容示例代码:wxml部分示例代码:wxss部分 1.查找数据时,条件中...
  • 主要介绍了Selenium常见异常解析及解决方案示范,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • java 常见异常错误代码

    千次阅读 2016-01-14 10:54:18
    java异常错误代码 1.应当谨慎地使用那些只有HTTP1.1支持的状态代码,因为许多浏览器还只能够支持HTTP1.0。如果你使用了 HTTP1.1特有的状态代码,最好能够检查一下请求的HTTP版本号。 状态代码 状态信息 含义 2. ...
  • 常见异常分类、异常处理(一)

    千次阅读 2019-04-02 20:11:34
    常见异常分类、异常处理 常见的异常分类: 程序中的异常 示例1:给出除数和被除数,求商 如果除数为0,出异常 如果除数或者被除...
  • Vue常见异常处理技巧

    千次阅读 2019-06-22 15:46:33
    常见5中Vue异常报错处理 常见错误 第一种:引用一个不能存在的变量: <div id="app" v-cloak> Hello, {{text}} </div 上述代码运行后不会抛出错误,但是在控制台会有[Vue warn]消息。 第二种:将变量...
  • python——常见异常及异常处理

    千次阅读 2018-02-25 14:07:32
    什么是异常?  ------异常:不正常的情况 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行。一般情况下,在Python无法正常处理程序时就会发生一个...代码错误或语法错误;程序都运行...
  • java常见异常

    万次阅读 2018-08-14 14:15:25
     这个异常大家肯定都经常遇到,异常的解释是&amp;quot;程序遇上了空指针&amp;quot;,简单地说就是调用了未经初始化的对象或者是不存在的对象,这个错误经常出现在创建图片,调用数组这些操作中,比如图片...
  • 异常处理及常见异常问题

    千次阅读 2018-05-31 19:22:00
    异常处理及常见异常问题1. 异常JavaException:1、Error2、RuntimeException运行时异常3、Exception4、throw用户自定义异常异常类分两大类型:Error类代表了编译和系统的错误,不允许捕获;Exception类代表了标准...
  • 异常捕获,其本质就是程序员希望有一个if...else代码块,可以将影响程序运行的情况包括进去: if(发生了影响程序运行的事件){ 执行处理该事件的应对方法 }else{ 程序正常运行 } 由此,我们就可以有对异常...
  • 厦航代码行设定了多种温江的MIME类型 profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/x-msdownload"); //browser.helperApps.alwaysAsk.force 针对位置的MIME...
  • java中20个常见异常举例源码,空指针异常,数组越界等,自己写的,以后查异常也方便了

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 363,059
精华内容 145,223
关键字:

代码常见异常