Merge branch 'master' of github.com:apache/dubbo-go-hessian2
diff --git a/java_exception/exception.go b/java_exception/exception.go
index 86d5648..30515ef 100644
--- a/java_exception/exception.go
+++ b/java_exception/exception.go
@@ -98,7 +98,7 @@
 	DeclaringClass string
 	MethodName     string
 	FileName       string
-	LineNumber     int
+	LineNumber     int32
 }
 
 //JavaClassName  java fully qualified path
diff --git a/java_unknown_exception.go b/java_unknown_exception.go
new file mode 100644
index 0000000..45f5a00
--- /dev/null
+++ b/java_unknown_exception.go
@@ -0,0 +1,88 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package hessian
+
+import (
+	"fmt"
+	"sync"
+)
+
+import (
+	"github.com/apache/dubbo-go-hessian2/java_exception"
+)
+
+var mutex sync.Mutex
+
+func checkAndGetException(cls classInfo) (structInfo, bool) {
+
+	if len(cls.fieldNameList) < 4 {
+		return structInfo{}, false
+	}
+	var (
+		throwable structInfo
+		ok        bool
+	)
+	var count = 0
+	for _, item := range cls.fieldNameList {
+		if item == "detailMessage" || item == "suppressedExceptions" || item == "stackTrace" || item == "cause" {
+			count++
+		}
+	}
+	// if have these 4 fields, it is throwable struct
+	if count == 4 {
+		if throwable, ok = getStructInfo(cls.javaName); ok {
+			return throwable, true
+		}
+		mutex.Lock()
+		defer mutex.Unlock()
+		RegisterPOJO(newBizException(cls.javaName))
+		if throwable, ok = getStructInfo(cls.javaName); ok {
+			return throwable, true
+		}
+	}
+	return throwable, count == 4
+}
+
+type UnknownException struct {
+	SerialVersionUID     int64
+	DetailMessage        string
+	SuppressedExceptions []java_exception.Throwabler
+	StackTrace           []java_exception.StackTraceElement
+	Cause                java_exception.Throwabler
+	name                 string
+}
+
+// NewThrowable is the constructor
+func newBizException(name string) *UnknownException {
+	return &UnknownException{name: name, StackTrace: []java_exception.StackTraceElement{}}
+}
+
+// Error output error message
+func (e UnknownException) Error() string {
+	return fmt.Sprintf("throw %v : %v", e.name, e.DetailMessage)
+}
+
+//JavaClassName  java fully qualified path
+func (e UnknownException) JavaClassName() string {
+	return e.name
+}
+
+// equals to getStackTrace in java
+func (e UnknownException) GetStackTrace() []java_exception.StackTraceElement {
+	return e.StackTrace
+}
diff --git a/list.go b/list.go
index 34c8aec..57aaa96 100644
--- a/list.go
+++ b/list.go
@@ -30,6 +30,10 @@
 	perrors "github.com/pkg/errors"
 )
 
+import (
+	"github.com/apache/dubbo-go-hessian2/java_exception"
+)
+
 var (
 	listTypeNameMapper = &sync.Map{}
 	listTypeMapper     = map[string]reflect.Type{
@@ -46,6 +50,8 @@
 		"date":             reflect.TypeOf(time.Time{}),
 		"object":           reflect.TypeOf([]Object{}).Elem(),
 		"java.lang.Object": reflect.TypeOf([]Object{}).Elem(),
+		// exception field
+		"java.lang.StackTraceElement": reflect.TypeOf([]*java_exception.StackTraceElement{}).Elem(),
 	}
 )
 
diff --git a/object.go b/object.go
index e2ef7b3..2a86820 100644
--- a/object.go
+++ b/object.go
@@ -377,6 +377,7 @@
 
 		index, fieldStruct, err := findFieldWithCache(fieldName, typ)
 		if err != nil {
+			// skip field
 			d.DecodeValue()
 			continue
 		}
@@ -547,6 +548,10 @@
 	cls = d.classInfoList[idx]
 	s, ok = getStructInfo(cls.javaName)
 	if !ok {
+		// exception
+		if s , ok = checkAndGetException(cls); ok {
+			return s.typ, cls, nil
+		}
 		if !d.isSkip {
 			err = perrors.Errorf("can not find go type name %s in registry", cls.javaName)
 		}